[英]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.