C语言使用fscanf读取不同格式的txt文本
1、读取数字/*a.txt:1 2 3 0.42 3 4 0.5*/ code如下:# include <stdlib.h># include <stdio.h>int main(){FILE* file;char path[] = "./a.txt";file = fopen(path,"r");int a, b, c;float d;while (fscanf(file
·
1、读取数字
/*
a.txt:
1 2 3 0.4
2 3 4 0.5
*/ code如下:
# include <stdlib.h>
# include <stdio.h>
int main()
{
FILE* file;
char path[] = "./a.txt";
file = fopen(path,"r");
int a, b, c;
float d;
while (fscanf(file, "%d %d %d %f", &a, &b, &c, &d) == 4)
{
printf("%d %d %d %f\n", a, b, c, d);
}
return 0;
}
/*
output:
1 2 3 0.400000
2 3 4 0.500000
*/ code如下
读取字符串文本
/*
a.txt:
张三,2022-3-12 12:00,睡觉
李四,2022-3-13:13:00,休息
*/ code如下:
# include <stdlib.h>
# include <stdio.h>
int main()
{
FILE* file;
char path[] = "C:\\Users\\20805687\\Desktop\\a.txt";
file = fopen(path,"r");
char Name[20];
char Time[20];
char Action[20];
while (fscanf(file, "%19[^,],%19[^,],%s", Name,Time,Action) == 3)
{
printf("%s %s %s\n", Name, Time, Action);
}
return 0;
}
/* output:
张三 2022-3-12 12:00 睡觉
李四 2022-3-13 13:00 休息
*/
备注:文件在vs中运行,如果运行错误,则可使用notepad++将文件编码格式更改为ANFS,则可复现出对应结果。
这里给大家解释一下上面的代码,首先,fscanf
函数的调用格式是:
int fscanf(FILE *stream,const char *format,...)
//而format参数指的是C字符串,形式为
[=%[*][width][modifiers]type=]
//分别解释一下
[*]为可选项,一般*后面的格式内容即会被忽视掉。
[width]为当前读取操作中读取的最大字符数,因此,上述代码中我使用的width=19;
[modifiers]为对应的附加参数所指向的数据指定一个不同于整型(针对 d、i 和 n)、
无符号整型(针对 o、u 和 x)或浮点型(针对 e、f 和 g)的大小: h :短整型(针对 d、i 和 n),
或无符号短整型(针对 o、u 和 x) l :长整型(针对 d、i 和 n),
或无符号长整型(针对 o、u 和 x),
或双精度型(针对 e、f 和 g) L :长双精度型(针对 e、f 和 g)
[type]熟知的 d整形 s字符串 f浮点型 c字符 等。
特别说明:
[^ ]表示匹配到的条件。例如
[^,]表示匹配到的逗号,前面的字符串
[^a-z]表示匹配到的a-z中的任意字符
[^]
另外,再解释一下为何读取字符串时不能像读取数字时简单的使用类似于
"fscanf(file,%s,%s,%s",Name,Time,Action)==3
的格式去读取呢,这是因为fscanf虽然是格式化从文件中读取输入,但是默认读取方式是使用空格作为分隔符的,想要使用逗号进行分割,必须得额外做出说明。因此,把对应代码改成
while (fscanf(file, "%s,%s", Name,Time) == 2)
则输出变为
更多推荐
已为社区贡献5条内容
所有评论(0)