2013-01-06 36 views
2

這一段我想有對本款尼古拉約祖蒂斯書「C++標準庫」(第一版)的518頁上的一些解釋:我需要一些幫助來了解從尼古拉約祖蒂斯書

這些標誌由basic_ios類維護,因此存在於basic_istreambasic_ostream類型的所有對象中。但是,流緩衝區沒有狀態標誌。一個流緩衝區可以被多個流對象共享,所以這些標誌只代表最後一次操作中發現的流的狀態。即使這只是在這個操作之前設置了goodbit的情況。否則,這些標誌可能已由某些較早的操作設置。

我不明白他的意思是「流緩衝區沒有狀態標誌」,在該段下面有一個標題爲「流狀態成員函數」的表。

+0

特別是你遇到麻煩用什麼?有一個流緩衝區,它沒有狀態標誌。 –

回答

2

流由兩個對象:

  1. 實際流對象(std::istreamstd::ostream,從std::ios導出)。
  2. 流緩衝器,即從std::streambuf派生的類。

狀態標記存在於std::ios中,但不存在於std::streambuf中。

+0

可以解釋一個流緩衝區如何被多個流對象共享。 –

+0

@ user1577873指針用於共享單個std :: streambuf。嚴格地說流不包含緩衝區,它只是指向它。 – milleniumbug

+1

@ user1577873:你可以從'std :: streambuf *'創建一個流,例如:'std :: ostream out(std :: cout.rdbuf());'。有了這個,你可以改變'out'的格式與'std :: cout'不同,寫入'out'或'std :: cout'讓字符出現在'std :: cout'的目的地正在寫入,使用爲各個流設置的格式。 –

1

有「流緩衝對象」和「流對象」。一個流緩衝區可以在多個流對象之間共享。每個流對象都有自己的一組標誌 - 所以一個流可能是「到達文件末尾」,另一個不是 - 或者對於使用相同緩衝區的兩個輸出流,十進制或十六進制輸出的標誌可能完全不同。當然,如果你對多個流使用相同的緩衝區,你將不得不小心不要把事情弄糟 - 在多個流上共享緩衝區並不常見,但它可以做!]

+1

使用多個數據流與一個緩衝器是混在一起的不同格式在輸出...例如使用一個對象打印一些十六進制數和另一打印一些十進制者的簡單方法。如果格式明顯不同,則比每次嘗試切換大量標誌都要乾淨。 – Potatoswatter

+0

@Patatoswatter你能舉一個簡單的例子來說明如何在你的答案中做到這一點? –

1

iostate標誌存儲關於輸出格式化的東西:是否要打印以十進制或十六進制打印的數字,大寫或小寫等。流對象控制格式化,所以標誌位於流對象內。

在iostreams中,緩衝區與格式不同。鏈接到iostream對象是一個流緩衝區對象,它控制從底層源發送和/或接收字符。緩衝區對象沒有這樣的標誌;它唯一的狀態變量處理準備(編碼)字符並可選地存儲(緩衝)它們以減少操作系統被要求執行I/O的次數。 (或者在stringstream的情況下,緩衝器提供流後面的最終儲存。)

+0

您在另一個答案中提到可以在一個緩衝區中使用多個流。你能舉個簡單的例子嗎? –

+0

@ user1577873既然你沒有給予好評的人,我有點動力不足。 – Potatoswatter

0

「流緩衝區」是basic_streambuf類的一個對象。該類沒有狀態標誌。每個流(basic_istream或basic_ostream)都有一個指向basic_streambuf的指針,但這些標誌是流的屬性,而不是流緩衝區的屬性。

1

所以一個有狀態標誌,但流緩衝區它使用

流緩衝器進入一個流內。

緩衝認爲流被髮送/它recieving到任何流被交談之前讀/寫的字節一些量(文件/標準輸入/的TCPSocket /等)。

流參考:http://www.cplusplus.com/reference/istream/iostream/

流緩衝器參考:http://www.cplusplus.com/reference/streambuf/streambuf/

默認流通常會創建它自己的流緩衝區,但你可以告訴它使用在構造函數中你所選擇的一個:http://www.cplusplus.com/reference/istream/iostream/iostream/

或者你可以獲取/設置與rdbuf法進行緩衝。

+1

流緩衝區不會進入流中。雖然某些派生流包含流緩衝區,但基本流使用streambuf,而不包含它。 –