【问题标题】:How to read from std::cin until the end of the stream?如何从 std::cin 读取直到流结束?
【发布时间】:2011-11-22 21:38:28
【问题描述】:

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

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

对于 a) 我可以阅读直到 \n 出现。对于 b) Edit: No (我可以阅读直到 std::cin.eof() 发生。) 但是当我不知道我遇到的是 a) 还是 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]
  • 无限等待处理循环

那我该怎么做呢?

【问题讨论】:

  • 告诉我们为什么你不能使用std::string。也许我们也可以帮助您解决这个问题。
  • 对于非标准代码,您可以在conio.h中使用kbhit()
  • @Rob 这是来自练习,我们还不“知道”std::string。我们也不能使用非标准代码。我要问的不是练习中直接需要的,但我只是好奇......
  • 我强烈建议重新设计这个要求。一个程序的输入界面应该是一致的。如果是单行,则应该是单行。如果它被读取到文件末尾,它应该被读取到文件末尾。对于不可移植的代码,有isatty,但如果绝对需要,最好是一个选项标志来设置模式。
  • 为什么不像while(std::cin>>std::noskipws>>buffer && !std::cin.eof() && buffer != '\n')那样结合这两个条件呢?

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


【解决方案1】:

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

【讨论】:

  • 我可以要求,但如果我不能呢? (在 linux shell/windows 'shell' 中 ^D 的按键是什么?)
【解决方案2】:

您可以使用(旧的)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 */
}

【讨论】:

    猜你喜欢
    • 2021-02-28
    • 2019-01-25
    • 2010-09-17
    • 1970-01-01
    • 2010-11-27
    • 1970-01-01
    • 1970-01-01
    • 2012-10-19
    相关资源
    最近更新 更多