如何从std::cin读取直到流结束

How to read from std::cin until the end of the stream?

本文关键字:结束 读取 cin std      更新时间:2023-10-16

我的问题是,我想从std::cin读取输入,但不知道输入有多长。我也必须用char,不能用std::string。我要处理两件事a)用户输入文本,当他点击[ENTER]时,程序停止读取。b)用户将std::cin重定向到一个文件(如.a.oput < file),它可以容纳多行。

Edit:刚才注意到std::cin.eof()在读取文件的情况下也总是false。

对于a),我可以读取直到n出现。对于b) Edit: No(我可以读取,直到std::cin.eof()发生。)但是当我不知道我得到的是a)还是b)问题时,我该如何中断阅读过程呢?

这是我的a)…

char buffer = ' ';
while(std::cin >> std::noskipws >> buffer && buffer != 'n')
{
    // do some stuff with buffer
}

…和b)

char buffer = ' ';
while(std::cin >> std::noskipws >> buffer)
{
    // do some stuff with buffer
}

我也知道有std::cin.tellg()来获取流中的当前位置。

Edit:因此,似乎在文件的情况下,输入流被终止,以std::cin >> std::noskipws >> buffer获得false的方式。上面的代码对a):

的作用
  • 等待用户输入并按[ENTER]
  • 然后循环用户在最后一行输入的每个字符。
  • 然后它再次等待用户输入并按[ENTER]
  • Infinite-waiting-processing-loop

我该怎么做呢?

您可以要求输入始终以EOF结束(意思是来自需要按下^D的命令行),然后一如既往地使用b的过程。这样就可以从cmdline进行多行输入

您可以使用(旧的)getline函数,该函数接受一个指向字符数组的指针,并且可以使用分隔符。但是你不能保证在任何情况下它都能读到eof(因为字符缓冲区可能太小了),但是使用字符数组而不注意它的大小是非常危险的(从安全灾难的角度来看),因为它可能导致缓冲区溢出,这很容易被利用。

这段代码应该使您能够从输入中逐行提取:

char buffer[256];
while(getline(buffer,256,'n')) { //get a line
   /* do something with the line */
}

读取最大字符数:

char buffer[256];
while(getline(buffer,256)) {//get a maximum amount out of the input
   /* do something with the line */
}