为啥只有在 Windows 控制台程序中按 Ctrl+Z 时才会终止输入? [复制]
Posted
技术标签:
【中文标题】为啥只有在 Windows 控制台程序中按 Ctrl+Z 时才会终止输入? [复制]【英文标题】:Why is input only sometimes terminated when I press Ctrl+Z in a Windows console program? [duplicate]为什么只有在 Windows 控制台程序中按 Ctrl+Z 时才会终止输入? [复制] 【发布时间】:2013-10-22 18:12:35 【问题描述】:我知道使用 ctrl-z 来表示 EOF 或 EOT 通常已过时且不推荐,但我只是对幕后发生的事情感到好奇。
假设我在 C++ 中有这样的东西:
#include <iostream>
#include <string>
int main()
while (!cin.eof())
string str;
getline(cin, str);
cout << "out of while" << endl;
return 0;
如果我执行 abc[^Z][newline],程序仍然运行。与 abc[^D][newline] 相同。
但如果我输入的一行纯粹包含[^Z][newline],则程序正常存在。
我知道它可能是特定于操作系统的,但我只是好奇那里发生了什么。
【问题讨论】:
Windows/DOS 并不以在命令行中有用而闻名。尝试向 Cygwin/MSYS 人员询问他们尝试使程序在 bash 和 cmd.exe 上运行的经验。顺便说一句,while (!cin.eof())
是不好的形式;不会改变您的结果,但几乎在所有情况下都是不正确的。
【参考方案1】:
首先,这篇文章对 Ctrl-Z(DOS / Windows)和 Ctrl-D(UNIX / Linux)有一些很好的了解:http://latedev.wordpress.com/2012/12/04/all-about-eof/
非常值得一读。它还指出了上面的 while 循环存在问题。
最重要的是,Ctrl-Z 不表示 EOF。但是,当它是该行的第一个字符时,大多数从控制台读取的 Windows 程序将其识别为输入的结尾。结果实际上是cin
上的EOF。实际上,以文本模式打开的文件可能表现相同,尽管 C++ 标准中没有任何要求。
请注意,从历史上看,用于输入结束的 Ctrl-Z 必须位于行首。行中其他地方的 Ctrl-Z 没有相同的效果。
【讨论】:
以上是关于为啥只有在 Windows 控制台程序中按 Ctrl+Z 时才会终止输入? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
boostrap之弹出框(popover),控制只有一个只显示框