【发布时间】:2018-01-21 17:51:21
【问题描述】:
string s;
while(getline(cin,s)){
cout << "---" << endl
for(auto c: s) cout << int(c) << endl;
}
cout << "Exiting";
如果我的输入是Ctrl+Z,那么我按一次回车,我的程序立即退出。
^Z
Exiting
如果我在按Ctrl+Z之前输入了一个字符,那么我必须按两次回车,我的程序不会退出。
s^Z
---
115
26
我一直将 Ctrl+Z 解释为 EOF 字符。 getline 将继续直到它到达这个字符,此时 getline 测试为 false 并且我的程序将退出。我很好奇为什么我的程序将 Ctrl+Z 解释为 substitute character 26,这取决于是否有前面的字符,以及为什么它对我来说是必要的在第二个示例中按两次 Enter 键?
【问题讨论】:
-
行首的 Ctrl+Z 由 Windows 控制台本身处理,但奇怪的是它仅适用于一般的
ReadFile调用,而不是特定的ReadConsole调用。在这种情况下,读取将lpNumberOfBytesRead返回为 0,这是 C/C++ 运行时将其解释为 EOF。 -
在第二个例子中必须按两次回车是奇怪的。它将 SUB ("\x1a") 字符保留在缓冲区中并删除其后的所有内容,包括 CRLF 行结尾。如果它没有在结果中保留 SUB,那几乎是可以理解的,因为 Windows C 和 C++ 运行时将此字符视为 EOF 标记。 ISTM 此处的正确行为应该是从
getline返回,并在 SUB 之前添加任何内容,而不是将其保留在缓冲区中并继续阅读。
标签: windows c++11 iostream windows-console