为什么我需要在循环条件中包含EOF?

时间:2018-04-21 14:33:34

标签: c while-loop eof getchar

我已经完成了编写一个程序的任务,该程序将接受键盘输入(不包括空格)并在不使用数组的情况下打印到.txt文件。

我尝试使用while循环来执行此操作但是获得了无限循环,然后我开始堆栈溢出并在另一个问题中找到解决方案,EUREKA!

添加:

&& ch != EOF 

解决了我的问题。

但是,我并不完全理解解决方案的工作原理,并希望了解为什么需要第二个条件。

while((ch=getchar()) != '\n' && ch != EOF)
   {
       putc(ch, fin);
   }
   fclose(fin);
   return 0;

谢谢。

1 个答案:

答案 0 :(得分:2)

因为getchar的返回值是成功时读取的字符,并且 错误或文件结束时EOF

  

man getchar

     

返回值

     

fgetc()getc()getchar()将读取的字符作为unsigned char广告投放到int EOF结尾文件或错误。

为什么stdin可能会到达文件结尾有几个原因:

  • 用户按 Ctrl + D (在Unix / Linux上)导致 stdin关闭
  • stdin已连接到管道($ cat file.txt | ./myprogram)和管道 已关闭,因为cat已结束。
  • stdin已连接到重定向($ ./myprogram < file.txt)和它 到了file.txt
  • 的末尾

在所有这些情况下,getchar最终会返回EOF而你无法保留 读。如果你这样做

while((ch=getchar()) != '\n')
{
    ...
}

stdin关闭,然后你总是在无休止的循环中,als EOF != '\n' 评估为真。所以为了保护自己,你必须检查 如果读操作失败。你通过检查阅读是否这样做 函数返回EOF。这就是为什么

int ch;
while((ch=getchar()) != '\n' && ch != EOF)
{
    ...
}

是使用getchar循环的正确方法。另请注意,ch必须是。{1}} 输入int

另请注意,这适用于所有 FILE个缓冲区(以读取模式打开), 不仅是stdin