所以,我是 C++ 的绝对初学者,在阅读书籍时我遇到了这个例子:
int character;
while ((character = cin.get())!= EOF)
cout.put(character);
所以我决定复制它并在Visual Studios中测试它,我遇到了这种情况:
Testing sentence 1
Testing sentence 1
Testing ^z sentence 2
Testing Why is the loop still going?
Why is the loop still going?
^z
所以理论上 cout.put() 函数应该在 cin.get() 到达 ctrl-z 之后停止。然而,循环继续。我什至尝试在输入的末尾使用 ctrl-z 并显示类似的结果,也许我错过了一些关于流和与 while 循环交互的重要知识?
在 Microsoft Windows 上,您必须在控制台上按 ENTER CTRL-Z ENTER 您的程序才能注册文件结尾。
在行中间按 CTRL-Z ENTER 是不够的。
这不是 C++ 语言本身的问题,而是操作系统和您正在使用的 C++ 运行时库的问题。
即使在 Ctrl-Z 输入之后循环仍在继续的原因是因为 Ctrl-Z 作为文件结束标记的行为取决于操作系统和您使用的控制台。
例如,在 Windows 中,Ctrl-Z 不是控制台中的文件结束标记,而是被解释为终止输入的信号。输入 Ctrl-Z 后,控制台继续接受输入,代码中的循环继续执行,直到遇到实际的文件结束标记(通常由 Ctrl-Z 后跟 Enter 键触发)。
为了使您的代码在 Windows 上正常工作,您可以修改它以检查文件结束标记和终止输入的信号,如下所示:
int character;
while ((character = cin.get())!= EOF && character != '\x1a')
cout.put(character);
这里'\x1a'代表Ctrl-Z的ASCII码,和EOF一起检查结束循环。此修改应使您的代码在 Windows 和其他平台上都能正常工作。