![](/img/trans.png)
[英]in boost iostream filtering_ostream, what is the difference between sync(), strict_sync() and flush()?
[英]What is the difference between flush() and sync() in regard to fstream buffers?
我正在閱讀關於 I/O 的 cplusplus.com 教程。 最后,它說 fstream 緩沖區與磁盤上的文件同步
明確地,使用操縱器:當在流上使用某些操縱器時,會發生顯式同步。 這些操縱符是:flush 和 endl。
和
明確地,與成員 function sync():調用流的成員 function sync(),它不帶參數,導致立即同步。 如果 stream 沒有關聯的緩沖區或發生故障,則此 function 返回一個等於 -1 的 int 值。 否則(如果 stream 緩沖區已成功同步)它返回 0。
除了一些其他隱含情況(例如破壞和 stream.close() )
在我的代碼中,我一直使用 flush()。
關於 std::flush() 的文檔:
沖洗 stream 緩沖區
將與 stream 關聯的緩沖區同步到其受控的 output 序列。 這實際上意味着緩沖區中所有未寫入的字符都會盡快寫入其受控的 output 序列(“刷新”)。
關於 std::streambuf::sync() 的文檔:
將輸入緩沖區與字符源同步
它被調用以將 stream 緩沖區與受控序列同步(就像文件流中的文件)。 公共成員 function pubsync 調用此受保護成員 function 來執行此操作。
如果這是一個新手問題,請原諒我; 我是菜鳥。
basic_ostream :: flush這是一個非虛函數,它將未經修改的更改寫入底層緩沖區。 如果出現錯誤,它會在使用的流對象中設置錯誤標志 。 這是因為返回值是對流本身的引用,以允許鏈接。
basic_filebuf :: sync這是一個虛函數,它將所有掛起的更改寫入基礎文件,並返回錯誤代碼以指示成功或失敗。
endl當應用於ostream
,將'\\n'
寫入流,然后在該流上調用flush
。
因此,實質上: flush
是任何流的更通用的函數,而sync
顯式綁定到文件。 flush
是非虛擬的,而sync
是虛擬的。 這改變了在繼承的情況下如何通過指針(到基類)使用它們。 此外,他們報告錯誤的方式不同。
sync
是input
流的成員,所有未讀的字符都從緩沖區中清除。 flush
是output
流的成員,緩沖輸出傳遞給內核。
C ++ I / O涉及許多類之間的協作: 流 , 緩沖區 , 語言環境和語言環境:: facet -s。
特別是sync
和flush
是存在於stream
和streambuf
中的成員函數,因此請注意您所引用的文檔,因為它們執行不同的操作。
在流 flush
告訴流告訴緩沖區(注意重定向)以將其內容刷新到目標上。 這確保沒有“待處理寫入”。
std::endl
,當用<<
應用於thestream
時,不超過一個
thestream.put('\n'); thestream.flush();
始終在流上 , sync
告訴流告訴緩沖區 刷新內容(用於輸出)和讀取(用於輸入)盡可能多地重新填充緩沖區。
注意-in buffers - sync也可以通過overflow
內部調用來處理“buffer full”(用於輸出)和“buffer empty”(用於輸入)情況。
因此我感覺到, sync
更像是一個“內部”函數,用於流緩沖通信和緩沖區實現(在不同的緩沖區類型中它是虛擬和覆蓋),而flush
更像是流和客戶端程序之間的接口。
endl
...只是一個捷徑。
我理解如下:
flush()
將把庫緩沖區中的數據放入OS的寫緩沖區,最終會導致完全同步(數據被完全寫出),但是當同步完成時,它肯定取決於操作系統。
sync()
將盡可能在給定的操作系統中嘗試強制實現完全同步 - 但所涉及的操作系統可能會或可能不會促進此操作。
所以flush()
是:從緩沖區中獲取數據並在行中寫入。
sync()
是:如果可能,現在強制數據被明確寫出。
這是我對此的理解,但是當我想到它時,我不記得我是如何達成這種理解的,所以我很想聽到別人的意見。
調用
fstream::flush()
和fstream::sync()
有什么區別?
沒有:兩者本質上都是調用rdbuf()->pubsync()
,然后調用std::streambuf::sync()
,請參閱 https 上的鏈接://en.cppreference.com/w/cpp/io/basic_fstream
構建並檢查哨兵object后,調用rdbuf()->pubsync()
和https://en.cppreference.com/w/cpp/io/basic_streambuf/pubsync
調用最派生的 sync() class
唯一的區別是定義函數的位置: sync
繼承自istream
,而flush
繼承自ostream
( fstream
繼承自兩者)。 當然,返回值是不同的: sync
返回一個 int(0 表示正常,-1 表示失敗)而flush
返回對 stream object 的引用。但您可能並不關心這些。
輸入流和 output 流的命名差異在於,對於輸入,它將內部緩沖區與輸入 stream(此處為文件)“同步”,以防更改或“刷新”從內部緩沖區到 output stream(再次:此處)的未決更改一份文件)。 即“sync from ”和“flush to ”命名更有意義。 但是對於iostream
為了完整(幾乎)從 Emilios 回答:
std::endl
thestream
當應用於帶<<
的流時,不超過一個thestream.put('\n').flush();
因此它附加一個換行符,然后調用流flush
function,然后最終調用緩沖區sync
function(通過pubsync
)。
只是基本上使用行緩沖的快捷方式,即寫入(直到)該換行符的末尾,然后刷新寫入的內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.