使用fscanf读取文件后的无限循环
我正在使用fscanf读取输入 (2,3) (3,4) 但每当我运行程序时,它就会进入无限循环。输入来自abc.txt文件,该文件必须作为命令行参数传递。代码如下所示使用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)){
#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中可能会出现未定义的行为。当然,最好这样做是好的。我暗中希望它是正确的格式(我在这个问题上遵循原文),它模糊了问题,而不是没有必要。