如何使用EOF作为完成循环的条件?在 C 中

How to use EOF as the condition to finish the loop? In C

提问人:dumping the core 提问时间:1/10/2023 更新时间:1/10/2023 访问量:170

问:

我做的有点像奥赛罗游戏。我收到一个包含字符串的文件,我必须读取和处理它们,并制作电路板。 收到的文件示例:

  1. 亚历杭德罗
  2. 费德里科,N
  3. B
  4. 第6天
  5. C4型
  6. 五国集团

然后我会将字符转换为数字,以便它可以适合我使用的int board[8][8]

我原以为当它到达 EOF 时它会退出循环,但相反,它永远不会停止循环,而是继续用 printf 重复最后一行。 这是在 main 函数中:

while( EOF != 1 && *error != 1)
    {
        tomaJugada(&fp,jugada);  //takes 1 line of the file
        toupper(jugada[0]);      
        int columna = convierte_a_int(jugada[0])-1;  //converts the letter to a number
        int fila =  (jugada[1]-'0')-1;               //converts the char number to int number
        printf("columna %i, fila %i \n",columna, fila);   
    }

这是辅助功能:

void tomaJugada(FILE** fp, char jugada[])
{    
    fgets(jugada,5,*fp);
    jugada[2] = '\0';
    //jugada[strcspn(jugada, "\n")] = 0;
}

我见过有人使用:

int ch = getc(fp);
  while (ch != EOF){...

但它会完善我需要使用的数据,也许我用错了?

总结:我想使用文件中的所有数据,到达 de EOF,然后结束循环。如何设置EOF的条件?

我希望我能很好地解释自己,我很感激任何帮助

C 循环 文件 EOF

评论

1赞 Ted Lyngmo 1/10/2023
应该做什么?这永远是正确的。 不会更改,通常定义为 。EOF != 1EOF-1
0赞 Eugene Sh. 1/10/2023
EOF != 1-这是怎麽? 是一个定义的符号,通常与 进行比较。此条件始终为真。EOF-1
1赞 Ted Lyngmo 1/10/2023
while(tomaJugada(&fp,jugada)) { ... }将是一个更健全的循环,其中返回或取决于它是否成功读取和解析了一行。tomaJugadatruefalse

答:

3赞 Ivaylo Strandjev 1/10/2023 #1

c 中的 EOF 只是一个常数(通常为 -1),将始终计算为相同(这保证为真,因为 EOF 始终为负)。您需要做的是检查 fgets 是否返回 null 指针(即在函数中),当这种情况发生时,要么发生了错误,要么您已经到达了文件的末尾。例如,为了消除两者之间的歧义,您可以使用 feof 函数。EOF != 1tomaJugada

评论

2赞 Bodo 1/10/2023
返回自的指针表示发生了 EOF 或错误,您需要使用和/或区分这些情况。NULLfgetsfeofferror
1赞 Ivaylo Strandjev 1/10/2023
是的,实际上很好,当发生错误时也可能返回空指针
0赞 Ivaylo Strandjev 1/10/2023
是的,我指出不等式永远是正确的,但 EOF 的值通常为 -1。我将对此进行扩展
0赞 chux - Reinstate Monica 1/10/2023
@Bodo 检查比检查更有优势。当之前设置了错误指示器并且发生文件结束时,两者都返回 true,即使返回是由于文件结束造成的。feof()ferror()fgets()ferror()feof()NULL
0赞 dumping the core 1/11/2023
感谢大家的回答和指出解决方案。祝你有美好的一天!