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

使用fscanf读取文件后的无限循环,c,file,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读取输入

(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);

}
#包括
#包括
int main(int argc,字符**argv){
INTA,b;
文件*fp=fopen(argv[1],“r”);
而(!feof(fp)){
fscanf(fp,(%d,%d)”、&a和b);
printf(“\n值为:%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
检查,因为
中断将很快发生。

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
检查,因为
中断将更快发生

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

我会成功的

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

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

会成功的。

#包括
#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);

}
#包括 int main(int argc,字符**argv){ INTA,b; 文件*fp=fopen(argv[1],“r”); char-linebuff[32]; 而(fgets(linebuff,sizeof(linebuff),fp)){ sscanf(linebuff,(%d,%d)”、&a和b); printf(“\n值为:%d%d\n”,a,b); } fclose(fp); }
#包括
#包括
int main(int argc,字符**argv){
INTA,b;
文件*fp=fopen(argv[1],“r”);
char-linebuff[32];
而(fgets(linebuff,sizeof(linebuff),fp)){
sscanf(linebuff,(%d,%d)”、&a和b);
printf(“\n值为:%d%d\n”,a,b);
}
fclose(fp);
}

我想你只需要
'\n'

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

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

但是试着用
sscanf
fgets
来做这样的操作。

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

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

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

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

不匹配扫描模式。
而(!feof(fp))
在C中从未工作过,也永远不会工作。只有在I/O操作之后,EOF才预先知道。
不匹配扫描模式。
而(!feof(fp))
在C中从未工作过,也永远不会工作。只有在I/O操作之后,EOF才事先知道。@P0W,我知道,fgets和sscanf是最佳选择,但OP要求problem@P0W,我知道,fgets和sscanf是最好的选择,但OP是在问问题的同时伤害了我的眼睛。。。虽然它可以正常工作,但它是出于所有错误的原因而这样做的。@Jens Right,我想修复OP的代码只是为了让它正常工作,并给出了如何“美化”它的提示。这样它会更好地“粘住”在他的脑海里。在这段时间里的恐惧伤害了我的眼睛。。。虽然它可以正常工作,但它是出于所有错误的原因而这样做的。@Jens Right,我想修复OP的代码只是为了让它正常工作,并给出了如何“美化”它的提示。这样它会更好地“粘”在他的脑海里。你应该检查从sscanf返回的th,否则可能会在printf中发生未定义的行为。当然,它最好这样做是好的。我暗中希望它是正确的格式(我在这个问题上遵循原始格式)。它模糊了问题,而不是没有必要。您应该检查sscanf返回的th,否则printf中可能会出现未定义的行为。当然,最好这样做是好的。我暗中希望它是正确的格式(我在这个问题上遵循原文),它模糊了问题,而不是没有必要。