使用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); ^
但尝试使用sscanf
和fgets
进行此类操作。