我的代码:
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp;
int id,q,p,r,a;
fp = fopen("g-ip.txt","r");
while(EOF!=fscanf(fp,"%d\t%d\t%d\t\t%d\t\t%d",&id,&q,&p,&r,&a))
printf("%d %d %d %d %d\n",id,q,p,r,a);
fclose(fp);
return 0;
}
格式字符串是这样的,因为我的g-ip.txt文件具有以相同格式写入的值。在执行代码时,它给了我错误的输出,即无限次打印的垃圾值。我应该使用数组来读取值吗?但我不想使用它。
答案 0 :(得分:2)
使用feof
和fscanf
的返回次数,请尝试使用
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp;
int id,q,p,r,a;
fp = fopen("g-ip.txt","r");
if (!fp)
perror("g-ip.txt"), exit(1);
while(!feof(fp)) {
id=q=p=r=a=0;
if (fscanf(fp," %d %d %d %d %d",&id,&q,&p,&r,&a)<5)
exit(1);
printf("%d %d %d %d %d\n",id,q,p,r,a);
}
fclose(fp);
return 0;
}
请注意,标签与scanf
格式字符串中的空格相同,不需要\t\t
。
答案 1 :(得分:2)
#include<stdio.h>
#include<stdlib.h>
int main()
{
FILE *fp;
int id,q,p,r,a;
int scanned;
char buffer[256] = {0};
fp = fopen("g-ip.txt","r");
while(fgets(buffer,sizeof(buffer)-1,fp))
{
scanned = sscanf(buffer,"%d %d %d %d %d",&id,&q,&p,&r,&a));
if(scanned == 5)
printf("%d %d %d %d %d\n",id,q,p,r,a);
}
fclose(fp);
return 0;
}
试试这个。无需提供'\ t'
答案 2 :(得分:1)
我怀疑fp
为NULL,或者因为文件不存在(可执行文件和不同目录中的文件?),或者因为可执行文件没有打开它的权限。
如果文件已成功打开,该函数将返回一个指向FILE对象的指针,该对象用于在涉及它的所有进一步操作中标识流。否则,返回空指针。
http://www.cplusplus.com/reference/clibrary/cstdio/fopen/
在使用它之前,您应该检查它是否为NULL。
答案 3 :(得分:0)
由于您没有发布输入行和结果输出行,因此很难确定究竟出现了什么问题。然而,一旦fscanf无法匹配,它就会失败,更重要的是,它可能会卡住,不断返回零并且永远不会完成。一个稍微有弹性的解决方案就是这样的:
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE *fp = fopen("g-ip.txt","r");
char enorbuf[2048];
int errors = 0;
while (fgets(enorbuf, sizeof(enorbuf), fp) != NULL)
{
int id, q, p, r, a;
if (sscanf(enorbuf, "%d\t%d\t%d\t\t%d\t\t%d", &id, &q, &p, &r, &a) != 5)
{
printf("Invalid input line: %s", enorbuf);
errors = 1;
}
else
{
printf("%d %d %d %d %d\n", id, q, p, r, a);
}
}
fclose(fp);
return errors ? EXIT_FAILURE : EXIT_SUCCESS;
}