如何在C中检查EOF?

如何在C中检查EOF?,c,file-io,eof,C,File Io,Eof,例如,我有一个文本文件,其中有几行数字 5 6 3 2 10 4 6 18 49 40 9 17 40 0 当我读入文件时,它不会在文件末尾停止。我的循环读入代码如下- while ((fscanf(spFile, "%d", &scores[i][j])) == 1 && spFile != EOF) { printf("%d ", scores[i][j]); if(j == 8) { i++;

例如,我有一个文本文件,其中有几行数字

 5  6  3 2 10  4 6 
18 49 40 9 17 40 0
当我读入文件时,它不会在文件末尾停止。我的循环读入代码如下-

while ((fscanf(spFile, "%d", &scores[i][j])) == 1 && spFile != EOF) {
        printf("%d ", scores[i][j]);

        if(j == 8) {
            i++;
            j = 0;
            printf("\n");
        } else {
            j++;
        }
        numOfStudents++;
    }
最大行数是50(因此一个50行的数组(必须将其作为数组而不是指针)),我让学生们数一数行数,当它结束时,它说50,而实际上只有2行


谢谢

循环的条件应如下所示:

while (fscanf(spFile, "%d", &scores[i][j]) > 0){
   /* Do Stuff */
}
while(1) {
  fscanf( .. );

  if(feof(fp)) {
    if(ferror(fp)) {
        /* stoped because an error check out errno */
    }

   break;
  }
或者,为了避免无法解析输入的情况:

while (!feof(spFile) && fscanf(spFile, "%d", &scores[i][j]) > 0){
   /* Do Stuff */
}
fscanf()将返回0或EOF

您还可以使用“feof()”函数


文件指针变量spFile永远不会等于EOF。“EOF”是由C运行时管理的状态,它不是文件指针本身

尝试检查
fscanf()
返回的字节数是否大于
0

while(fscanf(...) > 0) {
/* do something */
}
使用错误检查时,如下所示:

while (fscanf(spFile, "%d", &scores[i][j]) > 0){
   /* Do Stuff */
}
while(1) {
  fscanf( .. );

  if(feof(fp)) {
    if(ferror(fp)) {
        /* stoped because an error check out errno */
    }

   break;
  }

检查标准
feof
功能。。。(这是作业?)?(在此之前,请检查规范)提高编译器的警告级别,并注意警告
spFile
是指针
EOF
是一个整数:编译器将在比较无法比较的类型的值时向您发出警告。您可以检查
fscanf()
是否也返回了值
>0
。这毫无意义:
spFile!=EOF
@paulsm4我想可能是因为结果没有保存,所以无法在循环内部检查是否确实读取了任何内容。如果输入文件包含无法解析为空格或整数的一部分的字符,该怎么办<在这种情况下,code>fscanf()将永远不会返回
EOF
,并将永远卡在返回
0
的循环中。True@Rami Jarrar-如果您查看for scanf,您将看到它可以返回1)它成功读取的#/项(>0)、2)EOF(<0)或无效数据(0)。您的代码可能会陷入无限循环。但我还是投了你的赞成票——我认为多次反对票有点苛刻:)@ramijarrar-thanx赞成修改。希望其他人能重新考虑他们的反对票:)你的更新并不能解决问题。我想你是说!feof()
而(!feof(spFile)和&fscanf(spFile,“%d”,&scores[i][j])!=EOF)
如果输入中有“奇怪”的数据,则仍然是一个无限循环。理论上,指针spFile可以是EOF(-1),这表示指针可以容纳的最大地址。