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

时间:2011-11-22 21:38:29

标签: c++ iostream stdin eof io-redirection

我的问题是,我想从std::cin读取输入,但不知道输入的时间。此外,我必须char,不能使用std::string。 我必须处理两种方式: a)用户输入文本,当他按[ENTER]时,程序停止读取。 b)用户将std::cin重定向到可以容纳多行的文件(如.\a.oput < file)。

编辑:注意到std :: cin.eof()在读取文件时也总是为假。

对于a)我可以阅读直到\ n发生。对于b)编辑:否(我可以阅读直到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()来获取流中的当前位置。

编辑:因此,在文件的情况下,输入流会以std::cin >> std::noskipws >> buffer获取false的方式终止。 以上代码对a)的作用:

  • 等待用户输入并按[ENTER]
  • 然后循环遍历用户在最后一行输入的每个字符。
  • 然后它再次等待用户输入并按[ENTER]
  • 无限等待处理环

那我该怎么办?

2 个答案:

答案 0 :(得分:2)

您可以要求输入始终结束EOF(意味着需要按^D的命令行),然后一如既往地使用b的过程。然后,这将启用cmdline的多行输入

答案 1 :(得分:0)

您可以使用(旧)getline函数,该函数获取指向char数组的指针并可以使用分隔符。但你不能确保在每种情况下它都会读取到eof(因为char缓冲区可能太小),但是使用char数组并且不注意它的大小是非常危险的(并且来自无论如何,安全灾难性的事情可能导致buffer-overflows容易被利用。

此代码应该允许您从输入中逐行提取:

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 */
}