fscanf函数读取文件隔行读取,两三行数据的时候不读取第一行,单行数据的时候能把一行数据全读取出来,是什么问题呀
while里fscanf 写了2遍,那当然会丢一行
只有一行的时候,第二次读取不到东西,所以不会给变量赋值
超过一行的时候,只有偶数行会被赋值,奇数行的数据被丢弃了
把里面的fscanf 删掉
无法读取第一行的问题,可能是因为第一行的格式与格式控制字符串不匹配,可以检查一下文件的第一行是否正确。
while ()里面的 fscanf 已经读取了一次,while 循环体第一行又读取了一次,所以第一行丢了。
单行数据的时候,在 while ()里面读取成功,循环体第一行遇到EOF,其实是失败的。
fscanf和scanf非常的相似,他也是用来输出的,它的功能是读取文件流中的信息。、
其实,fscanf函数的功能就是将“区域一”的数据,以“区域二”的格式输入到“区域三”。
例如:将刚刚输入到文件流中的结构体打印出来
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
printf("%s\n", strerror(errno));
return 1;
}
struct stu a = {0};
fscanf(pf,"%d %s %s\n", &a.age, a.name, a.sex);
printf("%d %s %s\n", a.age, a.name, a.sex);
fclose(pf);
pf = NULL;
return 0;
可以尝试使用fgets函数替代fscanf函数,fgets函数可以每次读取一整行数据,在字符串中使用空格分隔单词,然后使用sscanf函数解析每个单词。
具体步骤如下:
1.打开文件,声明字符串buf和整型变量n,用于保存读取的行和个数。
2.使用fgets函数每次读取一行数据到buf中,如果读取失败则跳出循环。
3.将读取的行数加1。
4.将buf中的字符串用空格分隔为多个单词,使用sscanf函数对每个单词进行解析,将解析出的数据存入对应的变量中。
5.重复第2-4步,直到文件读取结束。
参考代码如下:
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE *fp = fopen("test.txt", "r");
if(fp == NULL) {
printf("Open file error!\n");
return -1;
}
char buf[1024];
int n = 0;
while(fgets(buf, sizeof(buf), fp) != NULL) {
n++; // 读取的行数加1
int a, b, c;
if(sscanf(buf, "%d %d %d", &a, &b, &c) != 3) {
printf("Parse error in line %d: %s\n", n, buf);
continue;
}
printf("Line %d: a=%d, b=%d, c=%d\n", n, a, b, c);
}
fclose(fp);
return 0;
}
当然,如果文件数据比较复杂,需要读取的数据类型比较多,可以考虑使用正则表达式对每行数据进行匹配处理,提高代码的通用性。