不理解 cin.get() 和 while 循环之间的交互

问题描述 投票:0回答:2

所以,我是 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 循环交互的重要知识?

c++ iostream
2个回答
0
投票

在 Microsoft Windows 上,您必须在控制台上按 ENTER CTRL-Z ENTER 您的程序才能注册文件结尾。

在行中间按 CTRL-Z ENTER 是不够的。

这不是 C++ 语言本身的问题,而是操作系统和您正在使用的 C++ 运行时库的问题。


0
投票

即使在 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 和其他平台上都能正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.