getline()的問題
來源:互聯網
上載者:User
我在寫一個輸入操作符時遇到一個問題。大家看這段源碼:
istream &operator>>(istream &os,checkoutrecord &che)
{ cout<<"enter the booker: ";
getline(os,che.booker);
cout<<"enter book_id: ";
os>>che.book_id;
cout<<<"enter tile: ";
cin.sync();
getline(os,che.tile);
if(os)
che.borrower=make_pair(che.booker,che.tile);
else
che=checkoutrecord();
return os;
}
這裡面有兩個getline()當我沒有清空輸入緩衝區時節che.tile總是不能輸入,後來知道
當我們用鍵盤輸入時,是先輸入到儲存區裡,當輸入che.book_id時,我們按斷行符號結束,
那系統只把斷行符號前的資料給了che.book_id
而斷行符號還在輸入緩衝區,然後直接給了後面的輸入,那第二個getline就直接輸出了。
所以就該調用一下sync()清一下輸入資料流。
認識到這個後我用cin.clear()試了一下,不行!!為什麼呢?原來是這麼回事。
cin.clear()只是將cin的狀態位設定為有效。比如while(cin>>x)這個退出迴圈時,
我們是按ctrl+z檔案結束符來結束輸入,這時候cin的eofbit位被設定成1,
那cin就處於無法輸入狀態,clear把所有的狀態位設定為有效,才可以繼續輸入,
但不清輸入緩衝區。
這裡還有一個疑點就是為什麼os不讀入空白字元或斷行符號呢。原因在這裡,getline()這個函數接受兩個參數:一個輸入資料流對象
和一個 string 對象。getline 函數從輸入資料流的下一行讀取,並儲存讀取的內容到不包括分行符號。和輸入操作符不一樣的是,
getline 並不忽略行開頭的分行符號。只要 getline 遇到分行符號,即便它是輸入的第一個字元,getline 也將停止讀入並返回。
如果第一個字元就是分行符號,則 string 參數將被置為空白 string。
那流的解釋C++ Primer裡給出瞭解釋:處理格式化輸入和輸出的 iostream 庫。iostream
庫的基礎是兩種命名為 istream 和 ostream 的類型,分別表示輸入資料流和輸出資料流。
流是指要從某種 IO 裝置上讀入或寫出的字元序列。術語“流”試圖說明字元是隨著時間
順序產生或消耗的。
這個問題到這裡大家應該都明白了。如果還不明白或有什麼疑問,大家一起討論。有問題時記的叫我啊。