2

我的问题是,我想从中读取输入,std::cin但不知道输入有多长。我也必须char而且不能使用std::string. 我必须处理两种方法:a)用户输入文本,当他点击 [ENTER] 时,程序停止阅读。b) 用户重定向到可以包含多行std::cin的文件(如)。.\a.oput < file

编辑:刚刚注意到 std::cin.eof() 在从文件读取的情况下也总是错误的。

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

这就是我所拥有的 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 >> bufferfalse. 上面的代码对 a) 做了什么:

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

那么我该怎么做呢?

4

2 回答 2

2

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

于 2011-11-22T21:41:24.380 回答
0

您可以使用(旧的)getline函数,它接受一个指向 char 数组的指针,并且可以使用分隔符。但是您将无法确保在每种情况下它都会读取到 eof (因为 char 缓冲区可能太小),但是使用 char 数组而不注意它的大小是非常危险的(并且从安全灾难点)无论如何,因为它可能导致缓冲区溢出,这很容易被利用。

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

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 */
}
于 2011-11-22T22:25:55.727 回答