关于#c语言#的问题:fscanf函数读取文件隔行读取,单行数据的时候能把一行数据全读取出来

fscanf函数读取文件隔行读取,两三行数据的时候不读取第一行,单行数据的时候能把一行数据全读取出来,是什么问题呀

img

img

while里fscanf 写了2遍,那当然会丢一行
只有一行的时候,第二次读取不到东西,所以不会给变量赋值
超过一行的时候,只有偶数行会被赋值,奇数行的数据被丢弃了
把里面的fscanf 删掉

无法读取第一行的问题,可能是因为第一行的格式与格式控制字符串不匹配,可以检查一下文件的第一行是否正确。

while ()里面的 fscanf 已经读取了一次,while 循环体第一行又读取了一次,所以第一行丢了。
单行数据的时候,在 while ()里面读取成功,循环体第一行遇到EOF,其实是失败的。

  • 帮你找了个相似的问题, 你可以看下: https://ask.csdn.net/questions/714878
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:C语言中fscanf函数
  • 你还可以看下c语言参考手册中的 c语言-fscanf()
  • 除此之外, 这篇博客: C语言重点篇:近万字总结文件操作函数中的 fscanf 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 在这里插入图片描述
    在这里插入图片描述

    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;
    

    在这里插入图片描述

  • 以下回答由chatgpt基于相关博客总结生成:

    可以尝试使用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;
    }
    

    当然,如果文件数据比较复杂,需要读取的数据类型比较多,可以考虑使用正则表达式对每行数据进行匹配处理,提高代码的通用性。