如何在EOF之前停止读取C文件?

时间:2017-01-06 15:41:53

标签: c file

我有一个文件是一系列数字,我通过C读取然后存储在数组中。列表末尾有一个新行,指针读取并发送到我的数组,这是有问题的。

数字列表:

9
8
6
5
23
42

代码:

FILE* fichier=NULL;
fichier = fopen("resultat.txt","r");
int i=0;
int ID[50];
while(fgetc(fichier)!=EOF && i<50){
    fscanf(fichier,"%d",&ID[i]);
    printf("%d\n",ID[i]);
    i++;
}
fclose(fichier);

输出I

42
23
9
8
5
6
5
17081006

输出I 想要

42
23
9
8
5
6
5

如何阻止它读取最后一行(除了返回之前为空)?

2 个答案:

答案 0 :(得分:4)

fscanf()无法读取一个数据时,您应该停止打印。

还应检查fopen()的返回值,以避免将NULL传递给文件操作函数并调用未定义的行为

FILE* fichier=NULL;
fichier = fopen("resultat.txt","r");
int i=0;
int ID[50];
if (fichier != NULL) {
    while(i<50 && fscanf(fichier,"%d",&ID[i]) == 1){
        printf("%d\n",ID[i]);
        i++;
    }
    fclose(fichier);
}

答案 1 :(得分:1)

问题在于feof()的行为以及您使用它的方式。 feof()的工作原理是返回文件上的最后一次读取操作是读取EOF标记还是实际数据 (嗯,您使用的是fgetc(),但行为是相同的反正)

在请求EOF之前,您的阅读循环没有读取。相反,您首先询问是否找到EOF,如果没有,则执行读取操作,打印结果然后再返回。在读取完最后一个数字后,fgetc()仍然不会返回EOF,因此循环再次进入并且您读取....没有,所以printf()打印无法理解的内容。现在,当您到达EOF时,下次您提出时,fgetc()会返回EOF

尝试更改代码,如下所示。我使用feof()代替fgetc(),因此我不会额外阅读,看看我是否已达到EOF

FILE* fichier=NULL;
int i=0;
int ID[50];
int num; /* temporary storage for number read from file */

fichier = fopen("resultat.txt","r");
fscanf(fichier,"%d",&num); /* first read, outside read loop */
while(!feof(fichier) && i<50) /* now you can ask for EOF */
{
    ID[i] = num;     /* if not EOF, store data read */
    printf("%d\n",ID[i]); /* and print it */
    fscanf(fichier,"%d",&num); /* then, read some more */
    i++;
}
fclose(fichier);