只有第一次拨打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()中截断的任何字符。
答案 0 :(得分:10)
std::cin.getline(line, recordLen+1);
此处,如果输入长于recordLen
个字符,则其余字符将不会被读取并保留在流中。下次您从cin
阅读时,您将阅读剩余的字符。请注意,在这种情况下,cin
会提升其failbit
,这可能就是您遇到的情况。
如果您的第一个输入长度恰好为recordLen
个字符,则只有换行符会保留在流中,而下一次调用getline
将会显示为空字符串。
除此之外,getline
会覆盖缓冲区。
如果您想忽略同一行中第一个recordLen
字符之外的任何内容,可以致电istream::clear
以清除failbit
和istream::ignore
以忽略剩下的该行在istream::getline
之后:
std::cin.getline(line, recordLen+1);
std::cin.clear();
std::cin.ignore( std::numeric_limits<streamsize>::max(), '\n' );