C++使用cin.get获取字符,遇到EOF不结束while循环

标签 c++ eof

以下是我的代码,我想从标准输入中读取字符,并在遇到 EOF(ctrl-z) 时结束。

#include<iostream>
#include<fstream>
#include<stdio.h>
#include<string>
using namespace std;

int main()
{
    string article ;    
    char nextChar;
    while( cin.get(nextChar) ) {
        if( cin.eof() ) break ;
        article.append(1, nextChar) ;
    }

    cout << article ;

    system("pause") ;
}

我测试这样的输入:

I am a student.<ctrl-z>

然后我按下回车键,但它并没有停止。

当我输入另一个 [ctrl-z],然后按 neter。

刚好可以退出while循环。

为什么第一个 [ctrl-z] 不发出 eof 条件信号?

最佳答案

以下解释略有简化。

这是您的操作系统的一项功能。这就是您的操作系统的工作方式。

文件结尾实际上是底层 read() 系统调用返回 0。文件结尾不是 CTRL-ZCTRL-Z 由您的操作系统解释以刷新其交互式 key 缓冲区,并让进程 read() 其内容。

当您在终端中键入内容时,在按下 Enter 之前,该进程实际上并没有结束读取任何内容。那时 read() 系统调用完成,并返回已读取的所有内容。通常,在按 Enter 之前,您可以退格并编辑您输入的内容,并且您的程序没有任何迹象表明您已经编辑了任何内容,它 read()s 是按 Enter 后该行的最终内容。

如果您键入内容,然后按 CTRL-Z,键入的输入也会被程序读取(),就好像它是键入的一样。

只有在没有输入任何内容且按下CTRL-Z 时,底层的read() 系统调用才会返回0,因为首先没有输入任何内容;这被解释为文件结束指示。但是如果先输入了一些东西,CTRL-Z 需要输入两次,一次是 read() 输入的内容,然后清空输入缓冲区,然后 CTRL-Z 第二次,导致 read() 为 0。

顺便说一句,您的代码有一个无害的错误。如果 cin.get() 成功,则 cin.eof() 永远不会为真。

关于C++使用cin.get获取字符,遇到EOF不结束while循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37535680/

相关文章:

c++ - 解释下面的C++方法

c++ - 我有可能使用与查找轮廓相关的编码

c++ - 使用可变模板参数的构造函数和函数

c - for 循环条件下的 getchar()

c - putc() 在 c 中返回什么?

c++ - boost::filesystem::path::native() 返回 std::basic_string<wchar_t> 而不是 std::basic_string<char>

c++ - std::queue 和 std::deque 清理

c - 在 C 上使用 while 循环和 eof 时出错

混淆缓冲区和 EOF 和 getchar

c - 为什么我在使用 fgets 时必须输入 EOF 3 次?