簡體   English   中英

C++:ostream 和 ostringstream 有什么區別?

[英]C++: What is the difference between ostream and ostringstream?

ostream 和 ostringstream 有什么區別? 你什么時候會使用一個和另一個?

簡而言之: ostringstream提供了一個streambufostream需要用戶提供一個。

要理解其中的含義,有必要稍微了解一下流的工作原理,我不確定 Web 上是否對此有很好的解釋。 ostream的基本抽象是格式化文本輸出。 你給它一個int或一個double (或一個用戶定義的類型——稍后會詳細介紹),然后它把它轉換成一個字符流,類型為char 它對該流的作用取決於附加到它的流streambuf 這是策略模式的一個示例,其中streambuf是策略 [1] 的抽象基類。 該標准提供了streambuffilebufstringbuf兩種實現; 在實踐中,除了最微不足道的應用程序外,您可能會自己實現一些應用程序。

輸出時,你總是使用ostream 它是定義<<運算符的類。 您正在將數據格式化為字符流,而您並不真正關心流的最終位置。

創建實例時:如果創建ostream ,則必須自己為其提供一個流streambuf 更常見的是,您將創建一個ofstream或一個ostringstream 這些都是從ostream派生的“便利”類,並為其提供流streambuffilebufstringbuf ,碰巧)。 實事求是地講,他們做是提供必要的streambuf (這影響了構造函數和析構函數,而不是很多人); ofstream的情況下,還有一些額外的功能可以轉發到filebuf接口中的其他功能。

當您定義自己的streambuf以提供ostream (和istream ,如果相關)的便利重載時,這很常見(但絕不是必需的),與ofstreamostringstream相同。

出於同樣的原因,在創建實例時,通常使用“方便”派生類之一,而不是直接使用ostream並提供您自己的流緩沖。

如果所有這些看起來都很復雜:iostream 類幾乎使用了 C++ 的所有功能(虛擬函數、模板和函數重載都起着重要作用)。 如果您只是在學習 C++,請不要太擔心:在構造實例時只需使用ofstreamostringstream ,但要傳遞對ostream引用。 當您了解虛擬函數、模板和運算符重載等技術時,請返回到 iostream 以了解它們在使代碼更靈活方面發揮的作用。


[1] 由於種種原因, std::streambuf實際上並不是抽象的。 但是里面虛函數的實現是沒用的; 提取總是返回 EOF,插入總是失敗。

這是 C++ 流類的繼承層次結構的好視圖 :)這篇文章在第3.1 ofstream and ostringstream3.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.

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