stdin中的文件结束

关于这个的问题已经在C中被问到文件结束(EOF),但它仍然没有完全解决我的问题。

在任何不是stdin数据流中, EOF对我有意义,例如,如果我有一些data.txt文件, fgetc()将读取所有字符并到达文件末尾并返回-1

我不明白的是stdinEOF的概念。 如果我使用getchar() ,它将等待我输入内容,所以如果没有写入,文件结束,( EOF )不会自动返回?

那么只有用户可以通过按Ctrl + Zstdin调用EOF吗? 如果是这样,那么在stdinEOF一些用途是什么? 我猜它会告诉程序继续读取,直到用户调用文件结尾? 是这个吗?

谢谢

所以,如果没有写入,文件结束,(EOF)不会自动返回?

不,它不应该由用户发送。

那么只有用户可以通过按Ctrl + Zstdin调用EOF吗?

是的,您可以使用可以在控制台中输入的特殊组合键来设置stdinEOF指示符,对于Linux控制台是Ctrl + D ,对于Windows,它是Ctrl + Z.

如果是这样,那么在stdinEOF一些用途是什么? 我想它会告诉程序继续读取,直到用户用户调用文件结束? 是这个吗?

它的使用取决于你是否指示用户明确地输入EOF ,例如,我认为python控制台会告诉你类似Press Ctrl+D or type quit() to exit

并且EOF不一定是-1它是一个宏,你应该总是用它来测试EOF指标。 更重要的是, EOF不是一个字符,它是一个特殊值,表示设置了E nd O f F ile指示符。

此外, getchar()等同于fgetc(stdin)

在linux bash中,如果按CTRL + D ,它将生成EOF

在Windows中,等效的是CTRL + Z.

所以,不,如果没有写入终端,则不会自动生成EOF扫描function处于等待状态。 因此,在没有任何其他输入的情况下,在等待状态下,如果按下CTRL + D ,则按键被[终端驱动程序]转换为EOF注意

通常,一旦键入某个值并按ENTER键,扫描function就会开始扫描。 要输入用于生成EOF的输入,您需要按CTRL + D.

相关:请参阅EOF的wiki条目

注意:感谢Drew先生的澄清。

stdin是一个流,在用户按下某些键之前,数据不可用。 磁盘上的文件已经有(固定数量的)内容。

stdin读取时,如果getchar()没有等待用户输入内容,那么程序将始终获得EOF 。 这将使stdin无法用作输入文件。

因为getchar()等待用户输入内容,所以无法通知输入已完成; 这就是为什么操作系统提供了一组键,当它们在控制台上按下时具有这种特殊含义。

Windows使用Ctrl Z和类Unix操作系统(包括OSX)使用Ctrl D来实现此目的。

文件stdin并不总是用户在键盘上键入。 如果将输入重定向到程序,它可能只是一个普通文件。

 program.exe  

让您感到困惑的是,没有给控制台窗口输入信息不会标记输入的结尾。 但是反过来考虑一下:如果控制台不为用户做一些缓冲,那么用户如何快速响应以至于程序不能在它之前终止? 按Enter键后 ,用户说这是一行输入。 换句话说:在控制台窗口中运行的程序总是等待下一个输入。

大多数程序定义了一个特殊的短语来结束控制台会话。 你可能知道exit