以下是我的代码,我想从标准输入中读取字符,并在遇到 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-Z
。 CTRL-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/