为什么我不能连续两次使用std :: cin.getline()?

时间:2013-05-06 06:38:50

标签: c++ istream

只有第一次拨打getline()似乎才能阅读std::cin中的任何内容。事件是buffer包含某些问题 - 为什么getline()不会覆盖buffer的内容?

我怎样才能第二次打电话给getline()来阅读?

我的代码:

const int recordLen = 20;

// truncate the input to 20 chars
void getText(char line[])
{
  std::cout << "Enter something for getText: ";
  std::cin.getline(line, recordLen+1);
  for(int i = std::strlen(line); i < recordLen; i++)
  {
    line[i] = ' ';
  }
  line[recordLen] = '\0';
}

int main()
{
  char buffer[340];
  getText(buffer);

  std::cout << buffer;

  std::cout << "Now enter some more text:";

  // put more text into buffer
  std::cin.getline(buffer, 30);
  std::cout << "you entered : " << buffer << std::endl;
  return 0;
}

所以 - 程序的示例输出:

为getText输入内容:alskdjfalkjsdfljasldkfjlaksjdf    alskdjfalkjsdfljasld现在输入更多文字:你输入了:

显示“现在输入更多文字:”后,程序立即显示“你输入了:”。它不会让我有机会输入更多文本,也不会显示从之前调用getline()中截断的任何字符。

1 个答案:

答案 0 :(得分:10)

std::cin.getline(line, recordLen+1);

此处,如果输入长于recordLen个字符,则其余字符将不会被读取并保留在流中。下次您从cin阅读时,您将阅读剩余的字符。请注意,在这种情况下,cin会提升其failbit,这可能就是您遇到的情况。

如果您的第一个输入长度恰好为recordLen个字符,则只有换行符会保留在流中,而下一次调用getline将会显示为空字符串。

除此之外,getline会覆盖缓冲区。

如果您想忽略同一行中第一个recordLen字符之外的任何内容,可以致电istream::clear以清除failbitistream::ignore以忽略剩下的该行在istream::getline之后:

std::cin.getline(line, recordLen+1);
std::cin.clear();
std::cin.ignore( std::numeric_limits<streamsize>::max(), '\n' );