【问题标题】:End of File in stdin标准输入中的文件结尾
【发布时间】:2015-03-28 18:43:57
【问题描述】:

已在此处提出有关此问题的问题 End of File (EOF) in C 但它仍然不能完全解决我的问题。

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

我不明白的是EOFstdin 中的概念。如果我使用getchar(),它会等待我输入一些东西,所以如果没有写入,文件结束,(EOF)不会自动返回?

那么是不是只有用户可以通过按Ctrl+Zstdin中调用EOF? 如果是这样,那么EOFstdin 中有哪些用途?我猜它告诉程序继续阅读,直到用户调用文件结尾?是这个吗?

谢谢

【问题讨论】:

  • 是的,只有ctrl+D 会通过 unix 上的标准输入为您提供 EOF。 ctrl+Z 在 Windows 上
  • 可能是等待实际输入的问题,这可能取决于input redirection

标签: c console stdin eof


【解决方案1】:

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

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

那么是不是只有用户可以通过按Ctrl+Zstdin中调用EOF

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

如果是这样,那么EOFstdin 中有哪些用途?我猜它告诉程序继续阅读,直到用户用户调用文件结尾?是这个吗?

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

EOF 不一定是-1,它是一个宏,您应该始终使用它来测试EOF 指标。更重要的是EOF 不是字符,它是一个特殊值,表示设置了 End Of File 指示符。

另外,getchar() 等价于 fgetc(stdin)

【讨论】:

  • 谢谢,我也是这么想的,EOF 也可能用于清空输入缓冲区?例如,您可以查看缓冲区中是否还有 EOF?它正在慢慢变得有意义
  • 我不这么认为,因为EOF 不是字符。
  • 我试试看是否还留在缓冲区中
  • “你可以在标准输入中插入 EOF”有点误导。像 ^D 这样的特殊键序列向stdin 发出信号,表示不再附加数据。我认为这些答案需要更加强调您的评论“EOF 不是字符”
【解决方案2】:

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

在 Windows 中,相当于 CTRL+Z

所以,不,如果 没有写入 到终端,则不会自动生成 EOFscanning 功能此时处于等待状态。因此,在没有任何其他输入的情况下,在等待状态下,如果按下 CTRL+D,则按键被 翻译 [由终端驱动程序] 到EOF注意

通常,一旦您输入某个值并按下 ENTER 键,scannning 功能就会开始扫描。要提供输入以生成EOF,您需要按CTRL+D

相关:请阅读wiki entry for EOF

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

【讨论】:

  • 值得指出的是,CTRL+D 只有在没有输入任何内容的情况下才会生成 EOF。否则,它会将输入的任何数据推送到stdin,就好像你按下了ENTER(不推送换行符)。
  • @DrewMcGowen 感谢先生的澄清。我会在我的答案中添加这些信息。
  • @DrewMcGowen 是否存在 EOF 可以留在输入缓冲区中的情况?
  • @Mcs 你是什么意思?
【解决方案3】:

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

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

因为getchar() 等待用户输入内容,所以无法发出输入完成的信号;这就是为什么操作系统提供了在控制台上按下时具有这种特殊含义的键组合。

Windows 使用 CtrlZ 和类 Unix 操作系统(包括 OSX)为此使用 CtrlD .

【讨论】:

    【解决方案4】:

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

    program.exe <input-from-file.txt
    

    您可能会感到困惑的是,不向控制台窗口提供输入并不标志着输入的结束。但是反过来想:如果控制台不为用户做一些缓冲,用户怎么会响应得如此之快以至于程序不会在它之前终止呢?按下 Enter 后,用户说这是一行输入。换句话说:在控制台窗口中运行的程序总是等待下一个输入的到来。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-05
      • 1970-01-01
      • 1970-01-01
      • 2015-10-13
      • 2013-03-18
      • 1970-01-01
      相关资源
      最近更新 更多