我有一个文件是一系列数字,我通过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
如何阻止它读取最后一行(除了返回之前为空)?
答案 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);