二者都是读文件操作函数
首先为了测试两个读文件操作函数的区别
我们先写入文件几个数:
void write_file() {
FILE* fp = fopen("test01.txt", "w");
if (!fp) {
perror("fopen error");
return -1;
}
fprintf(fp, "%d\n", 10);
fprintf(fp, "%d\n", 8);
fprintf(fp, "%d\n", 6);
fclose(fp);
}
查看文件
测试fscanf 函数读入文件
void read_file2() {
int a;
FILE* fp = fopen("test01.txt", "r");
if (!fp) {
perror("fopen error");
return -1;
}
while (1) {
fscanf(fp, "%d\n", &a);
if (feof(fp)) // 真 读到文件末尾
break;
printf("%d\n", a);
}
fclose(fp);
}
运行结果如下:
为何不能从文件中读到整数6呢?
因为fscanf函数每次调用时都会判断下一次调用是否匹配参数2 如果不匹配会提前结束读文件
当读到6时判断下一次调用\n 与参数2 不匹配 所以提前结束读文件 。
如果想要在控制台输出6 需要将打印函数 放在结束读文件代码之前
void read_file2() {
int a;
FILE* fp = fopen("test01.txt", "r");
if (!fp) {
perror("fopen error");
return -1;
}
while (1) {
fscanf(fp, "%d\n", &a);
printf("%d\n", a);
if (feof(fp)) // 真 读到文件末尾
break;
//printf("%d\n", a);
}
fclose(fp);
}
而利用fgets()函数读文件,需要将打印输出函数放在结束读文件代码之后。
void read_file3() {
int a;
char buf[1024];
FILE* fp = fopen("test01.txt", "r");
if (!fp) {
perror("fopen error");
return -1;
}
while (1) {
//memset(buf, 0, 1024);
fgets(buf, 1024, fp); //读 字符串
//printf("%s", buf);
if (feof(fp)) // 真 读到文件末尾
break;
printf("%s", buf);
}
fclose(fp);
}
如果打印函数放在结束读文件代码之前,且buf不被清空,则会在结束读文件操作之前,多打印一个缓存在buf中的数据
程序运行结果如下:
此外 fscanf()函数要求读入符合其参数2格式的数
而fgets()函数 除了函数的参数不同 之外,不管文件中什么格式的数都会以字符串的形式读取到。
为了测试这一条:我们手动将test01.txt中加入3个空格
主函数中 执行read_file2()
程序运行结果中,控制台不会输出与参数2 格式不符的 空格字符
而执行read_file3();
程序运行结果 控制台会输出读到的空格字符