在c++中,io操作都是有io對象來實現的,每個io對象又管理一個緩沖區,用於存儲程序讀寫的數據。
只有緩沖區被刷新的時候緩沖區中的內容才會寫入真實的文件或輸出設備上。
那麼,什麼情況下會刷新輸出緩沖區呢,有如下五種情況:
1.程序正常結束。作為main返回工作的一部分,將清空所有的輸出緩沖區。
2.在一些不確定的時候,緩沖區可能已經滿了,在這種情況下,緩沖區將會在寫下一個值之前刷新。
3.用操縱符顯示地刷新緩沖區,如用endl。
4.在每次輸出操作執行完畢後,用unitbuf操縱符設置流的內部狀態,從而清空緩沖區。
5.可將輸出流與輸入流關聯起來,在讀輸入流時將刷新其關聯的輸出緩沖區。
我們可以通過以下實例代碼來加深一下理解:
[cpp]
// 操縱符
cout << "hi!" << flush; // flushes the buffer, adds no data
cout << "hi!" << ends; // inserts a null, then flushes the buffer
cout << "hi!" << endl; // inserts a newline, then flushes the buffer
// unitbuf操縱符
cout << unitbuf << "first" << " second" << nounitbuf;
// unitbuf會在每次執行完寫操作後都刷新流
// 上條語句等價於
cout << "first" << flush << " second" << flush;
// nounitbuf將流恢復為正常的,由系統管理的緩沖區方式
// 將輸入輸出綁在一起
// 標准庫已經將cin和cout綁定在一起
// 我們可以調用tie()來實現綁定
cin.tie(&cout); // the library ties cin and cout for us
ostream *old_tie = cin.tie();
cin.tie(0); // break tie to cout, cout no longer flushed when cin is read
cin.tie(&cerr); // ties cin and cerr, not necessarily a good idea!
cin.tie(0); // break tie between cin and cerr
cin.tie(old_tie); // restablish normal tie between cin and cout
作者:RO_wsy