文件i / o的实现错误

时间:2012-07-18 05:16:49

标签: 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 %d\n",id,q,p,r,a);

    fclose(fp);

    return 0;
}

格式字符串是这样的,因为我的g-ip.txt文件具有以相同格式写入的值。在执行代码时,它给了我错误的输出,即无限次打印的垃圾值。我应该使用数组来读取值吗?但我不想使用它。

4 个答案:

答案 0 :(得分:2)

使用feoffscanf的返回次数,请尝试使用

之类的内容
#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;
}