提问人:dumping the core 提问时间:1/10/2023 更新时间:1/10/2023 访问量:170
如何使用EOF作为完成循环的条件?在 C 中
How to use EOF as the condition to finish the loop? In C
问:
我做的有点像奥赛罗游戏。我收到一个包含字符串的文件,我必须读取和处理它们,并制作电路板。 收到的文件示例:
- 亚历杭德罗
- 费德里科,N
- B
- 第6天
- C4型
- 五国集团
然后我会将字符转换为数字,以便它可以适合我使用的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的条件?
我希望我能很好地解释自己,我很感激任何帮助
答:
3赞
Ivaylo Strandjev
1/10/2023
#1
c 中的 EOF 只是一个常数(通常为 -1),将始终计算为相同(这保证为真,因为 EOF 始终为负)。您需要做的是检查 fgets 是否返回 null 指针(即在函数中),当这种情况发生时,要么发生了错误,要么您已经到达了文件的末尾。例如,为了消除两者之间的歧义,您可以使用 feof 函数。EOF != 1
tomaJugada
评论
2赞
Bodo
1/10/2023
返回自的指针表示发生了 EOF 或错误,您需要使用和/或区分这些情况。NULL
fgets
feof
ferror
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
感谢大家的回答和指出解决方案。祝你有美好的一天!
评论
EOF != 1
EOF
-1
EOF != 1
-这是怎麽? 是一个定义的符号,通常与 进行比较。此条件始终为真。EOF
-1
while(tomaJugada(&fp,jugada)) { ... }
将是一个更健全的循环,其中返回或取决于它是否成功读取和解析了一行。tomaJugada
true
false