是什么让fgets()实际上等待用户输入,如果指向stdin?

时间:2016-11-27 21:07:43

标签: c stdin fgets

我是C的新手,当我指向fgets()时,我想了解stdin中发生了什么。

基本上我的问题是这样,请原谅我,我可能实际上并不理解fgets()

如果我指定要在fgets()中使用的某个文件的指针,则fgets()从该位置开始向上读取\nEOF或指定的{ {1}}

那么,为什么我指向limit-1时的行为会有所不同,从某种意义上来说,是什么让等待用户输入,而不是简单地找不到任何东西来阅读,从而返回{{1 }}?

感谢您的时间

2 个答案:

答案 0 :(得分:4)

fgets()从参数流中读取。如果此流绑定到设备或管道,它将阻塞,直到从设备/管道获取输入或直到检测到文件末尾。

stdin通常与终端绑定。从终端读取读取任何未决输入,并且在fgets()的情况下保持读取,直到输入换行符或输入足够的字符。这里有一个额外的层要理解:终端的内核驱动程序默认执行自己的缓冲,导致输入操作阻塞,直到键入换行符,即使键入的字符数多于fgets()期望的字符数。这些额外字符在终端缓冲区中保持未决状态。

可以使用stty系统调用(在Posix系统上)将终端配置为原始模式(而不是默认的 cooked 模式)。这样做会删除设备驱动程序中的缓冲,但仍会在FILE *流中执行缓冲。 fgets()只能在执行此缓冲后访问流中的字符。绑定到设备的流通常默认为行缓冲,导致流缓冲与设备驱动器缓冲匹配。如果您将设备设置为原始模式而流设置为无缓冲,则fgets()键入的字符将被输入,fgets()将在获取换行符或读取时size-1停止读取{{1}} 1}}字符。

另请注意,您可以在熟悉模式下输入文件结尾,方法是在unix和OS / X系统上键入Control-D,在Windows系统上键入Control-Z Enter。

答案 1 :(得分:3)

  

如果我指定一个指向某个文件的指针,以便在fgets()中使用,那么fgets()从该位置开始向上读取,直到\ n,EOF或指定的限制-1

它无法从位置读取,它从文件中读取

  

那么,为什么我指向stdin,从某种意义上来说,是什么让它等待用户输入而不是简单地找不到任何东西来读取因此返回NULL?

它没有任何不同的行为。 fgets函数接受指向文件的指针,始终从该文件中读取。

我怀疑你将fgets与其他一些功能相混淆。 fgets函数是,并且只是一个从文件执行阻塞读取的函数。