使用fscanf读取文件后的无限循环

时间:2013-07-29 10:21:42

标签: c file

我正在使用fscanf来读取输入

  

(2,3)

     

(3,4)

从文件中

但是每当我运行程序时它都会进入无限循环。输入来自一个文件,例如abc.txt,它必须作为命令行参数传递。代码如下:

#include<stdio.h>
#include<stdlib.h>

int main(int argc,char **argv){

    int a,b;
    FILE *fp=fopen(argv[1],"r");

    while(!feof(fp)){
        fscanf(fp,"(%d,%d)",&a,&b);
        printf("\nThe values are :%d %d\n",a,b);
    }

    fclose(fp);

}

可能是什么问题?

4 个答案:

答案 0 :(得分:1)

fscanf找不到您想要阅读的数据时,它不会提升阅读位置,因此永远不会达到EOF。检查fscanf是否会给你两个数字,如果没有,则会中断:

while(!feof(fp)){
    if (fscanf(fp,"(%d,%d)",&a,&b) != 2) {
        break;
    }
    printf("\nThe values are :%d %d\n",a,b);
}

您可以完全放弃feof检查,因为break将会更快发生。

答案 1 :(得分:1)

  

请注意,流的内部位置指示器可能指向   下一个操作的文件结束,但仍然是文件结束   在操作尝试读取指示符之前,可能不会设置指示符   点。

while(fscanf(fp,"(%d,%d)\n",&a,&b) == 2){
    printf("\nThe values are :%d %d\n",a,b);
}

会做的伎俩。

答案 2 :(得分:1)

#include<stdio.h>
#include<stdlib.h>

int main(int argc,char **argv){
    int a,b;
    FILE *fp=fopen(argv[1],"r");
    char linebuff[32];

    while(fgets(linebuff, sizeof(linebuff), fp)){
        sscanf(linebuff,"(%d,%d)",&a,&b);
        printf("\nThe values are :%d %d\n",a,b);
    }

    fclose(fp);

}

答案 3 :(得分:1)

我认为你所需要的只是'\n'

这适用于我的代码,在您的示例输入上。

 fscanf(fp,"(%d,%d)\n",&a,&b);
                    ^

但请尝试使用sscanf&amp; fgets进行此类操作。