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

问题描述 投票:3回答:3

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

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

fgets(input,max_buffer,stdin);

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

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

只是想试试这个问题,提前感谢任何帮助。

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

c null eof fgets
3个回答
4
投票

来自herefgets

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

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

复制到str后的字符后会自动附加终止空字符。

因此,当用户输入CTRL-D(文件结尾)或遇到fgets(换行符)时,\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
}

2
投票

文件(C99§7.19.7.2):

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

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

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


1
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.