輸出緩衝區的管理

2021-05-02 08:47:19 字數 2369 閱讀 3657

每個 io 物件管理乙個緩衝區,用於儲存程式讀寫的資料。如有下面語句:

os << "please enter a value: ";

系統將字串字面值儲存在與流 os 關聯的緩衝區中。下面幾種情況將導致緩衝區的內容被重新整理,即寫入到真實的輸出裝置或者檔案:

1、程式正常結束。作為 main 返回工作的一部分,將清空所有輸出緩衝區。

2、在一些不確定的時候,緩衝區可能已經滿了,在這種情況下,緩衝區將會在寫下乙個值之前重新整理。

3、用操縱符(第 1.2.2 節)顯式地重新整理緩衝區,例如行結束符 endl。

4、在每次輸出操作執行完後,用 unitbuf 操作符設定流的內部狀態,從而清空緩衝區。

5、可將輸出流與輸入流關聯(tie)起來。在這種情況下,在讀輸入流時將重新整理其關聯的輸出緩衝區。

一.輸出緩衝區的重新整理

我們的程式已經使用過 endl 操縱符,用於輸出乙個換行符並重新整理緩衝區。除此之外,c++ 語言還提供了另外兩個類似的操縱符。第乙個經常使用的 flush,用於重新整理流,但不在輸出中新增任何字元。第二個則是比較少用的 ends,這個操縱符在緩衝區中插入空字元 null,然後後重新整理它:

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操縱符

如果需要重新整理所有輸出,最好使用 unitbuf 操縱符。這個操縱符在每次執行完寫操作後都重新整理流:

cout << unitbuf << "first" << " second" << nounitbuf;

等價於:

cout << "first" << flush << " second" << flush;

nounitbuf 操縱符將流恢復為使用正常的、由系統管理的緩衝區重新整理方式。

警告:如果程式崩潰了,則不會重新整理緩衝區

如果程式不正常結束,輸出緩衝區將不會重新整理。在嘗試除錯已崩潰的程式時,通常會根據最後的輸出找出程式發生錯誤的區域。如果崩潰出現在某個特定的輸出語句後面,則可知是在程式的這個位置之後出錯。

除錯程式時,必須保證期待寫入的每個輸出都確實被重新整理了。因為系統不會在程式崩潰時自動重新整理緩衝區,這就可能出現這樣的情況:程式做了寫輸出的工作,但寫的內容並沒有顯示在標準輸出上,仍然儲存在輸出緩衝區中等待輸出。

如果需要使用最後的輸出給程式錯誤定位,則必須確定所有要輸出的都已經輸出。為了確保使用者看到程式實際上處理的所有輸出,最好的方法是保證所有的輸出操作都顯式地呼叫了 flush 或 endl。

如果僅因為緩衝區沒有重新整理,程式設計師將浪費大量的時間跟蹤除錯並沒有執行的**。基於這個原因,輸出時應多使用 endl 而非 '/n'。使用 endl 則不必擔心程式崩潰時輸出是否懸而未決(即還留在緩衝區,未輸出到裝置中)。

三.將輸入和輸出綁在一起

當輸入流與輸出流綁在一起時,任何讀輸入流的嘗試都將首先重新整理其輸出流關聯的緩衝區。標準庫將 cout 與 cin 綁在一起,因此語句:

cin >> ival;

導致 cout 關聯的緩衝區被重新整理。

互動式系統通常應確保它們的輸入和輸出流是綁在一起的。這樣做意味著可以保證任何輸出,包括給使用者的提示,都在試圖讀之前輸出。

tie 函式可用 istream 或 ostream 物件呼叫,使用乙個指向 ostream 物件的指標形參。呼叫 tie 函式時,將實參流綁在呼叫該函式的物件上。如果乙個流呼叫 tie 函式將其本身綁在傳遞給 tie 的 ostream 實參物件上,則該流上的任何 io 操作都會重新整理實參所關聯的緩衝區。

cin.tie(&cout); // illustration only: 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

乙個 ostream 物件每次只能與乙個 istream 物件綁在一起。如果在呼叫 tie 函式時傳遞實參 0,則打破該流上已存在的**。

此文摘自c++ primer

輸出緩衝區

輸出緩衝區 printf 輸出緩衝區 顯示器 printf函式列印的內容會先送入輸出緩衝區,輸出緩衝區將資料送到顯示器我們才能看見。什麼時候輸入緩衝區會將資料送到顯示器 什麼時候輸出緩衝區會清空 1 當輸出乙個換行符時 2 當輸入時,先清空輸出緩衝區 3 輸出緩衝區滿時 4 當主動呼叫fflush ...

輸入緩衝區與輸出緩衝區

本博文通過一段程式來理解輸入緩衝區與輸出緩衝區。程式如下 author wanghao created time thu 17 may 2018 06 03 12 ampdt file name test.c description include int main int argc,const c...

php 緩衝區,PHP的輸出緩衝區

1 什麼是緩衝區?緩衝區的作用是把輸入或者輸出的內容先放進記憶體,而不顯示或者讀取,最本質的作用就是協調高速cpu和相對緩慢的io裝置 磁碟等 的運作。2 php在執行的時候,在什麼地方有用到緩衝區?當執行php的時候,如果碰到了echo print r之類的會輸出資料的 php就會將要輸出的資料放...