差異

2014-10-29 114 views
4

有人可以解釋在微妙的差異:差異

ofstream f("test.txt") 
std::stringstream s; 
s<<""; 
f << s.rdbuf(); 
f.good() // filestream is bad!! 


ofstream f("test.txt") 
std::stringstream s; 
s<<""; 
f << s.str(); 
f.good() // is still ok! 

我主要使用.rdbuf()將字符串流推到文件(因爲它更高效),但是如果stringstream是空的,那麼文件流會變得很糟糕......?這不是愚蠢的嗎? 我覺得我不太明白<< s.rdbuf() ...

回答

5

插入運算符 「插入」 streambuffers設置failbit如果沒有字符可以從streambuffer提取 - [ostream.inserters]/9:

如果該功能沒有插入字符,則會調用setstate(failbit) (這可能會導致ios_base:: failure(27.5.5.4))。

雖然輸出字符串的插入運算符顯然不考慮寫入的字符數量。

看起來這是因爲插入一個streambuffer「轉發」streambuffer到流 - 如果沒有字符可以提取最確定的是在streambuffer本身有錯誤,這個錯誤應該由流錯誤狀態表示。輸出一個空的數據流是一個例外情況,據推測,這個數據不夠重要,無法考慮何時創建這個規則。