为什么需要两个 EOF 作为输入?
Why two EOF needed as input?
当我运行下面的代码时,我使用三个输入(在Ubuntu终端):
- abc(Ctrl+D)(Ctrl+D)
- abc(Ctrl+D)(回车)(Ctrl+D)
- abc(回车)(Ctrl+D)
代码在所有情况下都反应良好。我的问题是:为什么在 1) 和 2) 中我需要两个 EOF?
#include <iostream>
int main()
{
int character;
while((character=std::cin.get())!=EOF){}
std::cout << std::endl << character << std::endl;
}
您没有"two EOF"。 Bash 将 tty 置于原始模式,并根据上下文对 ^D 进行不同的解释。如果在换行符后键入 ^D,bash 将关闭前台进程的输入流。如果您先输入几个字符,bash 会要求您输入 ^D 两次,然后再输入。 (第一个 ^D 被视为 'delete')
这就是 "EOF" 字符的工作方式(在 "canonical" 模式输入下,这是默认设置)。它实际上从未发送到应用程序,因此将其称为 EOF
信号会更准确。
EOF
字符(通常是Ctrl-D)使当前行立即返回给应用程序。这与 EOL
字符 (Enter) 的行为非常相似,但与 EOL
不同的是,EOF
字符不包含在该行中。
如果在行首键入 EOF
字符,则零字节将返回到应用程序(因为未发送 EOF
字符)。但是如果 read
系统调用 returns 0 字节,则认为是文件结束指示。所以在一行的开头,一个 EOF
将被视为终止输入;在其他任何地方,它只会终止该行,因此您需要其中两个来终止输入。
有关详细信息,请参阅 .Posix terminal interface 规范。
当我运行下面的代码时,我使用三个输入(在Ubuntu终端):
- abc(Ctrl+D)(Ctrl+D)
- abc(Ctrl+D)(回车)(Ctrl+D)
- abc(回车)(Ctrl+D)
代码在所有情况下都反应良好。我的问题是:为什么在 1) 和 2) 中我需要两个 EOF?
#include <iostream>
int main()
{
int character;
while((character=std::cin.get())!=EOF){}
std::cout << std::endl << character << std::endl;
}
您没有"two EOF"。 Bash 将 tty 置于原始模式,并根据上下文对 ^D 进行不同的解释。如果在换行符后键入 ^D,bash 将关闭前台进程的输入流。如果您先输入几个字符,bash 会要求您输入 ^D 两次,然后再输入。 (第一个 ^D 被视为 'delete')
这就是 "EOF" 字符的工作方式(在 "canonical" 模式输入下,这是默认设置)。它实际上从未发送到应用程序,因此将其称为 EOF
信号会更准确。
EOF
字符(通常是Ctrl-D)使当前行立即返回给应用程序。这与 EOL
字符 (Enter) 的行为非常相似,但与 EOL
不同的是,EOF
字符不包含在该行中。
如果在行首键入 EOF
字符,则零字节将返回到应用程序(因为未发送 EOF
字符)。但是如果 read
系统调用 returns 0 字节,则认为是文件结束指示。所以在一行的开头,一个 EOF
将被视为终止输入;在其他任何地方,它只会终止该行,因此您需要其中两个来终止输入。
有关详细信息,请参阅 .Posix terminal interface 规范。