使用fgets()检测EOF,其中filesteam是stdin

时间:2015-08-16 22:24:38

标签: c null eof fgets

有点背景,我正在编写一个播放游戏的程序" box"它在linux命令行中运行,用C语言编写。提示等待用户输入,然后用fgets()读取并解释等。

作为任务规范的一部分,如果在等待用户输入的同时达到"文件结尾,则必须返回特定错误"。我知道fgets()在达到EOF时会返回null ...但是说我有

fgets(input,max_buffer,stdin);

在提示循环中如果用户提前退出用CTRL + C或CTRL + D说这是否意味着输入== NULL?

我甚至可以检测用户何时使用fgets执行此操作?

只是试图了解这一点,提前感谢任何帮助。

(OS:UNIX) (编译:​​gcc - c90)

3 个答案:

答案 0 :(得分:4)

来自herefgets

  

从流中读取字符并将它们作为C字符串存储到str中,直到读取(num-1)个字符或者到达换行符或文件结尾为止,以先发生者为准。

     

换行符使fgets停止读取,但它被函数视为有效字符,并包含在复制到str的字符串中。

     

在复制到str。

的字符后,会自动附加终止空字符

因此,当遇到fgets(换行符)时,用户输入CTRL-D(文件结束)时,\n将返回。 CTRL-C默认情况下 完全终止您的程序。

如果你想抓住CTRL-C并优雅地退出,你可以:

#include <signal.h>

void intHandler(int dummy) {
    //graceful CTRL-C exit code.
}

int main(void) {
    signal(SIGINT, intHandler);
    //your code
}

答案 1 :(得分:2)

文件(C99§7.19.7.2):

  

如果成功,fgets函数将返回 s 。如果遇到文件结尾且没有字符读入数组,则数组的内容保持不变,并返回空指针。如果在操作期间发生读取错误,则数组内容不确定并返回空指针。

因此,如果文件结束,但已读取字符,fgets将不会返回NULL。如果在读取任何输入之前发生了EOF,它将返回NULL

您可以使用feofferror函数区分EOF和读取错误。

答案 2 :(得分:1)

当最终用户使用Ctrl + C永久退出时,您的程序会立即失去控制权,这意味着您不会从fgets获得任何进一步的输入,甚至不会为NULL。

另一方面,

Ctrl + D关闭输入流而不关闭程序,因此您将从fgets调用中获得NULL结果。

您可以通过处理信号来设置程序以处理Ctrl + C,但这样的处理将在输入循环之外发生。