【问题标题】:error in implementation of file i/o文件 i/o 实现中的错误
【发布时间】:2012-07-17 02:14:31
【问题描述】:

我的代码:

#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 文件具有以相同格式写入的值。在执行代码时,它给了我错误的输出,即无限次打印的垃圾值。我应该使用数组来读取中的值吗?但我不想使用它。

【问题讨论】:

  • 稍微偏离主题:在 fscanf 中指定空白字符并不新鲜。
  • 数据文件是否写在同一台电脑上?
  • @steffen:是的,数据已写入同一台计算机
  • 好的。排除了字节序问题
  • 我刚刚尝试了你的确切代码,它对我有用...我用gcc test.c编译

标签: c linux file-io ubuntu-10.04


【解决方案1】:

使用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

【讨论】:

    【解决方案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'

    【讨论】:

    • 如果fscanf 仅解析两个整数,则while 的条件为真,但行为错误。您应该按照我的建议测试feoffscanf 的结果计数。
    • 是的,你是对的。但是您的 feof 方法将在终止循环之前在文件末尾读取额外的一行。更喜欢使用fgetssscanf,就像我在编辑中显示的那样
    【解决方案3】:

    我怀疑fp 为NULL,要么是因为文件不存在(可执行文件和文件在不同的目录?),要么是因为可执行文件没有打开它的权限。

    如果文件已成功打开,该函数将返回一个指向 FILE 对象的指针,该对象用于在涉及它的所有进一步操作中识别流。否则返回空指针。

    http://www.cplusplus.com/reference/clibrary/cstdio/fopen/

    你应该在使用它之前检查它不是NULL。

    【讨论】:

    • 我也查过,fp不是空的,请提出其他解决方案。
    • fopen 的测试结果很好,但由于 OP 有无限输出,这不是问题。 fopenNULL 结果会导致对 fscanf 的第一次调用崩溃!
    【解决方案4】:

    由于您没有发布输入行和结果输出行,因此很难判断到底出了什么问题。但是,一旦 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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-20
      相关资源
      最近更新 更多