簡體   English   中英

C ++流混淆:istreambuf_iterator vs istream_iterator?

[英]C++ streams confusion: istreambuf_iterator vs istream_iterator?

istreambuf_iteratoristream_iterator什么區別? 一般來說,stream和streambufs有什么區別? 我真的找不到任何明確的解釋,所以決定在這里問。

IOstreams使用streambufs作為輸入/輸出的源/目標。 實際上,streambuf系列完成了有關IO的所有工作,IOstream-family僅用於格式化和字符串/字符串轉換。

現在, istream_iterator接受一個模板參數,該參數說明了streambuf中未格式化的字符串序列應該被格式化為什么,就像istream_iterator<int>將所有傳入的文本解釋為(空格分隔的)為int

另一方面, istreambuf_iterator只關心原始字符並直接迭代它傳遞的istream的關聯streambuf。

通常,如果您只對原始字符感興趣,請使用istreambuf_iterator 如果您對格式化輸入感興趣,請使用istream_iterator

我所說的所有內容也適用於ostream_iteratorostreambuf_iterator

這是一個非常嚴密的秘密: 本身就是一個iostream,幾乎與從計算機上的文件讀取或寫入文件無關。

iostream基本上充當streambuf和locale之間的“媒人”:

在此輸入圖像描述

iostream存儲了一些關於如何進行轉換的狀態(例如,轉換的當前寬度和精度)。 它使用那些來指示語言環境如何以及在何處進行轉換(例如,將此數字轉換為緩沖區中寬度為8且精度為5的字符串)。

雖然你沒有直接詢問它,但是反過來的語言環境實際上只是一個容器 - 但是(相當奇怪)一個類型安全的異構容器。 它包含的東西是facet 構面對象定義整個區域設置的單個構面。 該標准定義了從讀取和寫入數字( num_getnum_put )到分類字符(ctype facet)的所有方面。

默認情況下,流將使用“C”語言環境。 這是非常基本的 - 數字只是轉換為數字流,它識別為字母的唯一內容是26個小寫字母和26個大寫英文字母,依此類推。 但是,您可以使用您選擇的不同區域設置imbue流。 您可以選擇要在字符串中指定的名稱使用的語言環境。 一個特別有趣的是由空字符串選擇的一個。 使用空字符串基本上告訴運行時庫選擇它“認為”最適合的語言環境,通常基於用戶配置操作系統的方式。 這允許代碼以本地化格式處理數據,而無需針對任何特定語言環境明確編寫。

因此, istream_iteratoristreambuf_iterator之間的基本區別在於,來自istreambuf_iterator的數據尚未完成由語言環境完成的(大部分)轉換,但來自istream_iterator數據已由語言環境轉換。

對於它的價值,認為“大部分的”在上一段中所指的事實,當你從一個istreambuf讀取數據(通過迭代器或其他方式)基於地區的轉型的一個點點 :隨着各種“格式化“種類的東西,語言環境包含一個codecvt facet,這是用來從一些外部表示轉換為一些內部表示(例如,UTF-8到UTF-32)。

忽略這樣一個事實可能更有意義,即它們都存儲在一個語言環境中,並且只考慮所涉及的各個方面:

在此輸入圖像描述

這就是istream_iteratoristreambuf_iterator之間的真正區別。 對來自任一個的數據進行一點轉換(至少可能),但對來自istreambuf_iterator的數據進行的轉換要 istreambuf_iterator

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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