0

我的代码:

#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

4 回答 4

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

于 2012-07-18T05:23:23.210 回答
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'

于 2012-07-18T05:26:20.937 回答
1

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

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

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

在使用它之前,您应该检查它是否不为 NULL。

于 2012-07-18T05:18:41.787 回答
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;
}
于 2012-07-18T08:42:49.417 回答