我正在学习C++,并试图理解为什么将EOF字符(在Windows上为Ctrl + Z)放在行末时无法打破while循环?
我的代码:
int main() {
char ch;
while(cin >> ch) {
cout << ch;
}
}
当我输入^Z时,循环会中断;
但当我输入12^Z时,它不会中断。
我正在学习C++,并试图理解为什么将EOF字符(在Windows上为Ctrl + Z)放在行末时无法打破while循环?
我的代码:
int main() {
char ch;
while(cin >> ch) {
cout << ch;
}
}
当我输入^Z时,循环会中断;
但当我输入12^Z时,它不会中断。
在C++标准中,您不会找到对您问题的答案。
cin >> ch
只要没有遇到文件结尾或输入错误,就会是“真”的条件。如何触发文件结尾条件没有被语言规定,它可以且通常会因操作系统而异,即使在同一操作系统中的配置选项也会有所不同。 (例如,类Unix系统默认使用control-D,但这可以通过stty
命令进行更改。)
Windows使用Control-Z来触发文本输入流的文件结尾条件;除了在行首之外,它实际上不会在其他位置触发文件结尾条件。
Unix的行为略有不同; 它在行首使用Control-D(默认情况下),或者在一行中使用两个 Control-Ds。
对于Unix,这仅适用于从终端读取时; 如果您正在从文件中读取,control-D只是另一个非打印字符,不会触发文件结尾条件。 当从磁盘文件中读取时,Windows似乎会认识到control-Z作为文件结尾触发器。
底线:不同的操作系统行为不同,很大程度上是因为历史原因。 C ++设计为与这些行为中的任何一种配合使用,这就是为什么它在某些细节上不具体说明的原因。
#include <iostream>
using namespace std;
int main()
{
char ch;
while(cin >> ch) {
cout << 0+ch << " '" << ch << "'" << endl;
}
}
这是由于cin >> ^Z将被评估为false。
更详细地说:cin.eof()将在此返回true,因此隐式调用eof()的while将返回false,从而结束循环。
如果您输入12^Z,则eof()将返回false,因为它可以解析有效的输入值,因此它不会停止循环。
您可能还对此SO感兴趣:
ch
中时,它就从cin中删除了。因此,在1和2被放入ch之后,只有^Z留在cin中,cin.eof()应该返回true。那么循环应该会终止,对吗? - Cuttereof
,不是吗?而且块根本不需要通过换行符连接,尽管在实践中它们通常会这样做。 - leftaroundabout