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>
然后我按下回车键,但它没有停止。
当我键入另一个[ctrl-z],然后按neter。
它只能退出while循环。
为什么第一个[ctrl-z]没有发出eof条件的信号?
下面的解释稍微简化了一些。
这是操作系统的一个功能。这就是操作系统的工作方式。
文件结尾实际上是返回0的底层read()
系统调用。文件结尾不是CTRL-Z
。操作系统将对CTRL-Z
进行解释,以刷新其交互式密钥缓冲区,并使进程read()
包含其内容。
当您输入一个终端时,直到按下Enter
,该过程实际上不会读取任何内容。此时,read()
系统调用完成,并返回已读取的所有内容。一般来说,在按下Enter
之前,您可以退格并编辑您键入的内容,并且您的程序没有指示您已经编辑了任何内容,所有这些read
()s都是按下Enter
之后的行的最终内容。
如果您键入某些内容,然后按CTRL-Z
,则程序键入的输入也是read
(),就好像它是在中键入的一样
只有当未键入任何内容,并且按下了CTRL-Z
时,底层的read()
系统调用才会返回0,因为首先没有键入任何内容;这被解释为文件结束指示。但是,如果某个内容首先被输入,则需要输入两次CTRL-Z
,一次输入到输入的read()
,然后清除输入缓冲区,第二次输入CTRL-Z
,以使read
()为0。
顺便说一下,您的代码有一个无害的错误。如果cin.get()
成功,则cin.eof()
永远不可能为真。
相关文章:
- 如何确定我已使用非编码文件到达 EOF?
- 编译包含字符串的代码时遇到问题
- 遇到新行时,有没有办法停止istream_iterator
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- 如何在C++向量中奇数元素前面加上值-1,我在使用insert函数时遇到了问题
- 在 for 循环中查找问题时遇到困难
- 创建结构的数组时遇到分段错误
- 代码在我的计算机上运行良好,但是在将其提交给coursera时遇到未知的信号11问题
- 为什么我遇到分段错误?
- 在顶点着色器中使用 OpenGl 的未声明标识符,我在顶点着色器中绘制三角形时遇到问题
- 这些是什么样的错误?即使我不在 Linux 上工作,我也遇到了 Linux 错误
- 为什么我在尝试模板时遇到视觉工作室C++错误
- 如何从文本文件中读取数值,直到遇到字符类型?
- 从其他类访问类时遇到问题
- 我已经阅读了很多关于 2d 数组的信息,但我在作业中使用它时遇到了麻烦
- 打印问题.我在数组中打印值时遇到一些问题
- std::ifstream::read 不会读取所有 512 字节,并设置 EOF 和失败位
- 使用静态成员声明类时遇到问题
- C++使用cin.get来获取一个字符,但在遇到EOF时不会结束while循环
- std::cin 语法 当遇到 EOF 时