我已经完成了编写一个程序的任务,该程序将接受键盘输入(不包括空格)并在不使用数组的情况下打印到.txt文件。
我尝试使用while循环来执行此操作但是获得了无限循环,然后我开始堆栈溢出并在另一个问题中找到解决方案,EUREKA!
添加:
&& ch != EOF
解决了我的问题。
但是,我并不完全理解解决方案的工作原理,并希望了解为什么需要第二个条件。
while((ch=getchar()) != '\n' && ch != EOF)
{
putc(ch, fin);
}
fclose(fin);
return 0;
谢谢。
答案 0 :(得分:2)
因为getchar
的返回值是成功时读取的字符,并且
错误或文件结束时EOF
:
man getchar
返回值
fgetc()
,getc()
和getchar()
将读取的字符作为unsigned char
广告投放到int
或EOF
结尾文件或错误。
为什么stdin
可能会到达文件结尾有几个原因:
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
。