簡體   English   中英

關於 fstream 緩沖區,flush() 和 sync() 有什么區別?

[英]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() )

調用 fstream::flush() 和 fstream::sync() 有什么區別? 結束?

在我的代碼中,我一直使用 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是虛擬的。 這改變了在繼承的情況下如何通過指針(到基類)使用它們。 此外,他們報告錯誤的方式不同。

syncinput流的成員,所有未讀的字符都從緩沖區中清除。 flushoutput流的成員,緩沖輸出傳遞給內核。

C ++ I / O涉及許多類之間的協作: 緩沖區語言環境語言環境:: facet -s。

特別是syncflush是存在於streamstreambuf中的成員函數,因此請注意您所引用的文檔,因為它們執行不同的操作。

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繼承自ostreamfstream繼承自兩者)。 當然,返回值是不同的: 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM