3

我知道使用 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][换行符] 相同。

但是如果我输入的一行纯粹包含 [^Z][newline],则程序正确存在。

我知道它可能是特定于操作系统的,但我只是对那里发生的事情感到好奇。

4

1 回答 1

1

首先,这篇文章对 Ctrl-Z(DOS / Windows)和 Ctrl-D(UNIX / Linux)有一些很好的了解:http: //latedev.wordpress.com/2012/12/04/all-about-eof/

非常值得一读。它还指出了上面的 while 循环的一个问题。

最重要的是,Ctrl-Z 并不表示 EOF。但是,当它是该行的第一个字符时,大多数从控制台读取的 Windows 程序将其识别为输入的结尾。结果实际上是一个 EOF on cin。事实上,以文本模式打开的文件可能会以相同的方式运行,尽管 C++ 标准中没有任何要求。

请注意,从历史上看,用于输入结束的 Ctrl-Z 必须位于行首。行中其他地方的 Ctrl-Z 没有相同的效果。

于 2013-12-08T22:16:20.970 回答