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

我正在使用fscanf来读取输入

(2,3)

(3,4)

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

#include #include 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); } 

可能是什么问题?

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会更快发生。

 #include #include 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); } 

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

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

会做的伎俩。

我想你需要的只是'\n'

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

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

但尝试使用sscanffgets进行此类操作。