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 裝置上讀入或寫出的字元序列。術語“流”試圖說明字元是隨著時間
順序產生或消耗的。
   這個問題到這裡大家應該都明白了。如果還不明白或有什麼疑問,大家一起討論。有問題時記的叫我啊。   
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.