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芬:是的,数据都写在同一台电脑上了。好的