2013-05-06 148 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

相關問題