这里有人问这个问题 End of File (EOF) in C 但它仍然没有完全解决我的问题。
EOF
在任何不是stdin
的数据流中对我有意义,例如,如果我有一些data.txt
文件,fgetc()
会读取所有字符并进入文件结束并返回-1
。
我不明白的是EOF
中stdin
的概念。如果我使用getchar()
,它会等我输入内容,所以如果没有写入,文件结束,(EOF
)不会自动返回?
那么只有用户可以通过按 Ctrl + Z 来调用EOF
中的stdin
?
如果是,那么EOF
中stdin
的一些用途是什么?我想它会告诉程序继续读取,直到用户调用文件结束?这是吗?
谢谢
答案 0 :(得分:15)
所以如果没有写入,文件结束,(EOF)不会自动返回?
不,不是应该由用户发送。
那么只有用户可以通过按 Ctrl + Z 来调用
EOF
中的stdin
?
是的,您可以使用可在控制台中输入的特殊组合键为EOF
设置stdin
指示符,对于 Ctrl + D的Linux控制台,对于Windows,它是 Ctrl + Z 。
如果是,那么
EOF
中stdin
的一些用途是什么?我想它会告诉程序继续读取,直到用户用户调用文件结尾?这是吗?
使用它取决于您是否指示用户明确输入EOF
,例如,我认为python
控制台会告诉您类似Press Ctrl+D or type quit() to exit
的内容。
并且EOF
不一定是-1
它是一个宏,您应该始终使用它来测试EOF
指标。更重要的是EOF
不是一个字符,它是一个特殊值,表示 E 和 O f F ile指标是集。
此外,getchar()
相当于fgetc(stdin)
。
答案 1 :(得分:5)
在linux bash中,如果按 CTRL + D ,它将生成EOF
。
在Windows中,等效值为 CTRL + Z
所以,不,如果没有写入到终端,那么不会自动生成EOF
。 扫描功能处于等待状态。因此,在没有任何其他输入的情况下,在等待状态下,如果按下 CTRL + D ,则按键已翻译 [由终端驱动程序]到EOF
。注意
通常,一旦键入某个值并按 ENTER 键,扫描功能就会开始扫描。要提供输入以生成EOF
,您需要按 CTRL + D 。
相关:请EOF
注意:感谢Drew先生的澄清。
答案 2 :(得分:2)
stdin
是一个流,在用户按某些键之前,数据不可用。磁盘上的文件已经有(固定数量的)内容。
从stdin
阅读时,如果getchar()
没有等待用户输入内容,则程序将始终获得EOF
。这将使stdin
无法用作输入文件。
因为getchar()
等待用户输入内容,所以没有办法表示输入完成;这就是为什么操作系统在控制台上按下时会提供具有这种特殊含义的键的组合。
Windows使用 Ctrl Z 和类Unix操作系统(包括OSX)使用 Ctrl D 达到此目的
答案 3 :(得分:0)
文件stdin
并不总是用户在键盘上输入。如果您将输入重定向到您的程序,它可能只是一个普通文件。
program.exe <input-from-file.txt
令您感到困惑的是,没有给控制台窗口输入信息不会标记输入的结尾。但反过来考虑一下:如果控制台不为用户做一些缓冲,那么用户如何快速响应以至于程序不能在它之前终止?按 Enter 后,用户说这是一行输入。换句话说:在控制台窗口中运行的程序总是等待下一个输入。
大多数程序定义一个特殊短语来结束控制台会话。您可能知道exit
。