繁体   English   中英

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

[英]C++ use cin.get to get a character, but not end the while loop when encounter the EOF

以下是我的代码,我想从stdin中读取字符,并在遇到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>

然后按Enter键,但它没有停止。

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

它只是可以从while循环中退出。

为什么第一个[ctrl-z]不通知eof条件?

以下说明略有简化。

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

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

当您输入终端时,该过程实际上直到Enter才结束读取任何内容。 到那时, read()系统调用完成,并返回已读取的所有内容。 通常,在按Enter键之前,您可以退格并编辑您键入的内容,并且程序不表示您已编辑了任何内容,它所read全部内容是按Enter后该行的最终内容。

如果键入内容,然后按CTRL-Z ,则键入的输入也read被程序read (),就像键入一样。

仅当未键入任何内容并按下CTRL-Z ,底层的read()系统调用才会返回0,因为首先没有键入任何内容。 这被解释为文件结束指示。 但是,如果首先输入某些内容,则需要输入两次CTRL-Z ,一次read()输入的输入,然后清除输入缓冲区,然后再次CTRL-Z ,导致read ()为0。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM