1

我正在使用 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

4 回答 4

1

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

这适用于我的代码,作为您的示例输入。

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

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

于 2013-07-29T10:54:14.733 回答
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);

}
于 2013-07-29T10:29:36.487 回答
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将很快发生。

于 2013-07-29T10:24:09.450 回答
1

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

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

会成功的。

于 2013-07-29T10:25:20.980 回答