C 执行文件i/o时出错
我的代码:C 执行文件i/o时出错,c,linux,file-io,ubuntu-10.04,C,Linux,File Io,Ubuntu 10.04,我的代码: #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
#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;
}
#包括
#包括
int main()
{
文件*fp;
int-id,q,p,r,a;
fp=fopen(“g-ip.txt”,“r”);
而(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);
返回0;
}
格式字符串之所以如此,是因为我的g-ip.txt文件中的值是以相同的格式写入的。在执行代码时,它给了我错误的输出,即垃圾值被无限次打印。我应该使用数组读取中的值吗?但我不想使用它 我怀疑
fp
为空,可能是因为文件不存在(可执行文件和不同目录中的文件?),或者是因为可执行文件没有打开它的权限
如果文件已成功打开,该函数将返回指向文件对象的指针,该对象用于在涉及该文件的所有后续操作中标识流。否则,将返回空指针
您应该在使用它之前检查它是否为空。我怀疑
fp
为空,可能是因为文件不存在(可执行文件和不同目录中的文件?),或者是因为可执行文件没有打开它的权限
如果文件已成功打开,该函数将返回指向文件对象的指针,该对象用于在涉及该文件的所有后续操作中标识流。否则,将返回空指针
在使用它之前,您应该检查它是否为空。使用
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;
}
#包括
#包括
int main()
{
文件*fp;
int-id,q,p,r,a;
fp=fopen(“g-ip.txt”,“r”);
如果(!fp)
perror(“g-ip.txt”),出口(1);
而(!feof(fp)){
id=q=p=r=a=0;
如果(fscanf(fp,“%d%d%d%d%d”,&id,&q,&p,&r,&a)使用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;
}
#包括
#包括
int main()
{
文件*fp;
int-id,q,p,r,a;
fp=fopen(“g-ip.txt”,“r”);
如果(!fp)
perror(“g-ip.txt”),出口(1);
而(!feof(fp)){
id=q=p=r=a=0;
如果(fscanf(fp,“%d%d%d%d%d”,&id,&q,&p,&r,&a)#包括
#包括
int main()
{
文件*fp;
int-id,q,p,r,a;
int扫描;
字符缓冲区[256]={0};
fp=fopen(“g-ip.txt”,“r”);
while(fgets(buffer,sizeof(buffer)-1,fp))
{
扫描=sscanf(缓冲区,“%d%d%d%d%d”、&id、&q、&p、&r、&a));
如果(扫描==5)
printf(“%d%d%d%d%d\n”,id,q,p,r,a);
}
fclose(fp);
返回0;
}
试试这个。不需要给“\t”\include
#包括
int main()
{
文件*fp;
int-id,q,p,r,a;
int扫描;
字符缓冲区[256]={0};
fp=fopen(“g-ip.txt”,“r”);
while(fgets(buffer,sizeof(buffer)-1,fp))
{
扫描=sscanf(缓冲区,“%d%d%d%d%d”、&id、&q、&p、&r、&a));
如果(扫描==5)
printf(“%d%d%d%d%d\n”,id,q,p,r,a);
}
fclose(fp);
返回0;
}
试试这个。不需要给出“\t”因为不发布输入行和结果输出行,所以很难判断到底出了什么问题。但是,一旦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;
}
#包括
#包括
int main()
{
文件*fp=fopen(“g-ip.txt”,“r”);
查尔·诺布夫[2048];
整数误差=0;
while(fgets(enorbuf,sizeof(enorbuf),fp)!=NULL)
{
int-id,q,p,r,a;
如果(sscanf(ENRBUF,“%d\t%d\t%d\t\t%d\t\t%d”、&id、&q、&p、&r、&a)!=5)
{
printf(“无效的输入行:%s”,enrobuf);
误差=1;
}
其他的
{
printf(“%d%d%d%d%d\n”,id,q,p,r,a);
}
}
fclose(fp);
返回错误?退出失败:退出成功;
}
由于没有发布输入行和生成的输出行,很难判断到底出了什么问题。但是,一旦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;
}
#包括
#包括
int main()
{
文件*fp=fopen(“g-ip.txt”,“r”);
查尔·诺布夫[2048];
整数误差=0;
while(fgets(enorbuf,sizeof(enorbuf),fp)!=NULL)
{
int-id,q,p,r,a;
如果(sscanf(ENRBUF,“%d\t%d\t%d\t\t%d\t\t%d”、&id、&q、&p、&r、&a)!=5)
{
printf(“无效的输入行:%s”,enrobuf);
误差=1;
}
其他的
{
printf(“%d%d%d%d%d\n”,id,q,p,r,a);
}
}
fclose(fp);
返回错误?退出失败:退出成功;
}
我也检查过,fp不是空的,请建议其他解决方案。测试fopen
的结果很好,但由于OP有无限输出,这不是问题。如果fopen
的NULL
结果将导致对fscanf
的第一次调用崩溃!我也检查过,fp不是空的,请提示st其他一些解决方案。测试fopen
的结果很好,但因为OP有无限的输出,这不是问题所在。fopen
的NULL
结果会使对fscanf
的第一次调用崩溃!稍微偏离主题:在fscanf中指定空白字符不是什么新鲜事。数据文件是否已写入在同一台计算机上?@steffen:是的,数据是在同一台计算机上写入的OK。这排除了EndianIt的问题。我刚刚尝试了您的精确代码,它对我有效…我使用gcc test.c
编译,稍微偏离了主题:您不熟悉在fscanf中指定空格字符。数据文件是在同一台计算机上写入的吗?@stef芬:是的,数据都写在同一台电脑上了。好的