c++ - 为什么 EOF 字符放在行尾时不起作用?

标签 c++ windows stream event-handling eof

我正在学习 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-D。

对于 Unix,这仅适用于从终端读取时;如果您正在从文件中读取,control-D 只是另一个非打印字符,它不会触发文件结束条件。即使从磁盘文件读取时,Windows 似乎也将 control-Z 识别为文件结束触发器。

底线:不同的操作系统表现不同,主要是由于不明的历史原因。 C++ 旨在处理这些行为中的任何一种,这就是为什么它没有具体说明某些细节的原因。

关于c++ - 为什么 EOF 字符放在行尾时不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11378899/

相关文章:

c++ - libavcodec 返回的损坏的 AVFrame

c++ - 为具有 std::thread 成员的类 move 构造函数

windows - 无法在 App Manifest Design 中打开 Package.appxmanifest

c# - 使用 robo copy 和 process 进行文件复制

python - 在没有管理员权限的 Windows 上安装 python 模块

java - -Java- TCP 中的数据 'loss'(奇怪,因为 TCP 不允许数据转义)

c++ - 为什么派生类中有模板名(基类是模板的实例)?

C++ sscanf 空格分隔的字符串

c# - 如何在 C# 中使用 StreamReader(新手)

java - 获取 javax.xml.stream.XMLStreamReader 读入的字节数