2011-11-14 74 views
55

我想了解更多關於I/O流如何在C++中工作,並且我很困惑什麼時候使用它。streambuf究竟是什麼?我如何使用它?

究竟是什麼streambuf
何時使用streambuf,與stringistreamvector相比? (我已經知道過去三年,但不知道如何streambuf比較他們,如果它在所有。)

+0

這是流緩衝區的一個糟糕的抽象。 – Pubby

+1

@Pubby:呃,什麼是「流緩衝區」?它與流或緩衝區有什麼不同? – Mehrdad

+0

據我所知,一個流格式化輸入/輸出並將其存儲在緩衝區中。 – Pubby

回答

38

流緩衝表示輸入或輸出設備和爲該設備的未格式化I/O提供低級別接口。另一方面,流通過基本的未格式化的I/O函數,尤其是通過格式化的I/O函數(即,operator<<operator>>重載)在緩衝器周圍提供更高級別的包裝。流對象也可以管理流緩衝區的生命週期。

例如,文件流具有內部文件流緩衝區。流管理緩衝區的生命週期,緩衝區是爲文件提供實際讀寫功能的。流的格式化操作符最終訪問流緩衝區的未格式化的I/O函數,因此您只需要使用流的I/O函數,而不需要直接觸摸緩衝區的I/O函數。

瞭解差異的另一種方法是查看它們對區域設置對象的不同用途。流使用與格式相關的方面,例如numpunctnum_get。您還可以預期,流operator<<operator>>對於自定義時間或金錢數據類型的超載將使用時間和金錢格式化方面。然而,流緩衝區使用codecvt方面來在它們的接口使用的單元和字節之間進行轉換。因此,例如,basic_streambuf<char16_t>的接口使用char16_t,因此basic_streambuf<char16_t>默認情況下在內部使用codecvt<char16_t, char, mbstate_t>將寫入緩衝區的格式化的char16_t單位轉換爲寫入底層設備的char單位。因此,您可以看到流主要用於格式化,並且流緩衝區爲未格式化的輸入或輸出到可能使用不同的外部編碼的設備提供低級別接口。

當您只想對I/O設備進行無格式訪問時,可以使用流緩衝區。如果你想設置多個共享一個流緩衝區的流,你也可以使用流緩衝區(儘管你必須小心地管理緩衝區的生命週期)。也可能需要使用特殊目的的流緩衝區,例如C++ 11中的wbuffer_convert,它用作basic_streambuf<char>的外觀,使其看起來像寬字符流緩衝區。它使用它構建的codecvt facet而不是使用附加到任何語言環境的codecvt facet。您通常可以通過簡單地使用寬流緩衝區來實現相同的效果,該緩衝區充滿了具有相應方面的區域設置。

+3

這是5年太晚了,所以我不會將它作爲答案發布,並且不接受這個答案,但對於仍然被這個術語混淆的人來說,即使在閱讀完這些後:'streambuf'用於** raw **數據(例如原始字節,原始數據等),而'stream'用於**熟**數據(文本,整數格式化爲文本等)。換句話說,'stream'表示**解析**(或序列化)層。在處理純字符串時,您可以在技術上使用,但其含義不同:'streambuf'表示您希望原始數據本身是字符串,而'stream'則將編碼抽象出來。 – Mehrdad

46

隨着streambuf的幫助下,我們可以在一個更較低水平工作。它允許訪問底層緩衝區。

這裏有一些很好的例子:Copy, load, redirect and tee using C++ streambufs和參考比較,這可能是有幫助的,

enter image description here

有關詳細信息,請參閱本:IOstream Library

+3

+1指向一篇優秀的文章。 – jweyrich

+1

我全面搜索了一些可以解釋streambuf以及本文的東西。感謝您幫助我找到它! – wvdschel