2013-05-06 151 views
2

只有第一次致电getline()才会从std::cin中读取任何内容。 buffer是否包含某个问题 - 为什么getline()只覆盖buffer的内容?为什么我不能连续两次使用std :: cin.getline()?

我怎样才能得到第二个电话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 alskdjfalkjsdfljasldNow输入一些文字:您输入:

的显示后“现在输入更多文字:“,程序会立即显示”您输入的内容:“。它不会给我输入更多文本的机会,也不会显示从先前调用getline()截断的任何字符。

+0

你能告诉你给了什么输入? – Angew 2013-05-06 06:49:05

+2

'getline'确实会覆盖'buffer'的内容。我测试了你的代码,它按预期工作。你的问题一定是别的。 – john 2013-05-06 06:50:19

+0

@john,您是否在第一次输入请求时输入了超过'recordLen'字符?如果我这样做,第二次调用getline()似乎会被跳过,或者不允许我输入任何内容。 – BeeBand 2013-05-06 08:10:54

回答

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'); 
+0

第二次调用getline()后,我打印出从'cin'读取的内容。没有东西会得到输出 - 看起来好像getline()什么都不读。 – BeeBand 2013-05-06 08:12:10

+0

你说:“如果输入的时间长于'recordLen'字符'...下一次你从'cin'读取的时候,你会看到剩下的字符,程序*看起来没有这样做。 – BeeBand 2013-05-06 08:18:20

+0

我试过你的'ignore()' - 它没有区别 – BeeBand 2013-05-06 08:20:00

相关问题