[英]What is the difference between ostream and basic_ostream<unsigned char>?
[英]C++: What is the difference between ostream and ostringstream?
ostream 和 ostringstream 有什么區別? 你什么時候會使用一個和另一個?
簡而言之: ostringstream
提供了一個streambuf
, ostream
需要用戶提供一個。
要理解其中的含義,有必要稍微了解一下流的工作原理,我不確定 Web 上是否對此有很好的解釋。 ostream
的基本抽象是格式化文本輸出。 你給它一個int
或一個double
(或一個用戶定義的類型——稍后會詳細介紹),然后它把它轉換成一個字符流,類型為char
。 它對該流的作用取決於附加到它的流streambuf
; 這是策略模式的一個示例,其中streambuf
是策略 [1] 的抽象基類。 該標准提供了streambuf
、 filebuf
和stringbuf
兩種實現; 在實踐中,除了最微不足道的應用程序外,您可能會自己實現一些應用程序。
輸出時,你總是使用ostream
; 它是定義<<
運算符的類。 您正在將數據格式化為字符流,而您並不真正關心流的最終位置。
創建實例時:如果創建ostream
,則必須自己為其提供一個流streambuf
。 更常見的是,您將創建一個ofstream
或一個ostringstream
。 這些都是從ostream
派生的“便利”類,並為其提供流streambuf
( filebuf
和stringbuf
,碰巧)。 實事求是地講,他們做的是提供必要的streambuf
(這影響了構造函數和析構函數,而不是很多人); 在ofstream
的情況下,還有一些額外的功能可以轉發到filebuf
接口中的其他功能。
當您定義自己的streambuf
以提供ostream
(和istream
,如果相關)的便利重載時,這很常見(但絕不是必需的),與ofstream
或ostringstream
相同。
出於同樣的原因,在創建實例時,通常使用“方便”派生類之一,而不是直接使用ostream
並提供您自己的流緩沖。
如果所有這些看起來都很復雜:iostream 類幾乎使用了 C++ 的所有功能(虛擬函數、模板和函數重載都起着重要作用)。 如果您只是在學習 C++,請不要太擔心:在構造實例時只需使用ofstream
或ostringstream
,但要傳遞對ostream
引用。 當您了解虛擬函數、模板和運算符重載等技術時,請返回到 iostream 以了解它們在使代碼更靈活方面發揮的作用。
[1] 由於種種原因, std::streambuf
實際上並不是抽象的。 但是里面虛函數的實現是沒用的; 提取總是返回 EOF,插入總是失敗。
這是 C++ 流類的繼承層次結構的好視圖 :)這篇文章在第3.1 ofstream and ostringstream
節3.1 ofstream and ostringstream
有你需要的東西。
本質上: ofstream
類可以write data to files using stream operations
,而ostringstream
類可以write to strings
。
ostream
更通用(子類支持寫入不同的地方), ostringstream
是特定的寫入string
ostream
背后沒有rdbuf
實現,而ostringstream
使用 stringbuf。 試過文檔?
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.