使用fgets()检测EOF,其中filesteam是stdin
一点背景,我正在编写一个程序,它在linux命令行中运行游戏“盒子”并用C语言编写。有一个等待用户输入的提示,然后用fgets()读取并解释等。
作为任务规范的一部分,如果我在等待用户输入时达到“文件结束”,则必须返回特定错误。 我知道fgets()在达到EOF时会返回null …但是我说
fgets(input,max_buffer,stdin);
在提示循环中如果用户提前退出用CTRL + C或CTRL + D说这是否意味着输入== NULL?
我甚至可以检测用户何时使用fgets执行此操作?
只是想试试这个问题,提前感谢任何帮助。
(OS:UNIX)(编译:gcc – c90)
从这里 , fgets
:
从流中读取字符并将它们作为C字符串存储到str中,直到读取(num-1)个字符或者到达换行符或文件结尾,以先发生者为准。
换行符使fgets停止读取,但它被函数视为有效字符,并包含在复制到str的字符串中。
复制到str后的字符后会自动附加终止空字符。
因此,当用户输入CTRL-D(EOF) 或遇到\n
(换行符)时, fgets
将返回。 CTRL-C 默认会完全终止你的程序。
如果你想抓住CTRL-C并优雅地退出,你可以:
#include void intHandler(int dummy) { //graceful CTRL-C exit code. } int main(void) { signal(SIGINT, intHandler); //your code }
文件(C99§7.19.7.2):
如果成功,fgets函数返回s 。 如果遇到文件结尾且没有字符读入数组,则数组的内容保持不变,并返回空指针。 如果在操作期间发生读取错误,则数组内容是不确定的,并返回空指针。
因此,如果文件结束,但已读取字符,则fgets
不会返回NULL
。 如果在读取任何输入之前发生EOF,它将返回NULL
。
您可以使用feof
和ferror
function区分EOF和读取错误。
当最终用户使用Ctrl + C永久退出时,您的程序会立即失去控制权,这意味着您不会从fgets获得任何进一步的输入,甚至不能获得NULL。
另一方面,Ctrl + D关闭输入流而不关闭程序,因此您将从fgets调用中获得NULL结果。
您可以通过处理信号来设置程序以处理Ctrl + C,但这样的处理将在输入循环之外发生。