2015-11-20 48 views
4

它使用rdbuf一個衆所周知的方法將數據流複製到另一個:使用rdbuf複製流於空輸入失敗

#include <iostream> 
#include <fstream> 

int main() 
{ 
    std::ifstream in{"/tmp/foo.txt"}; 
    std::cerr << in.rdbuf(); 
    std::cerr << "Done\n"; 
} 

然而,這種斷裂(=設置壞位)我cerr/tmp/foo.txt是空的。因此,不顯示Done\n

這是爲什麼?使用G ++/libstdC++/GNU Linux和Clang ++/libC++/OS X觀察。

回答

3

這似乎是定義的行爲 - 請參閱http://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt

如果插入任何字符,執行setstate這(failbit)

我同意這是一個有點無助。

+0

完全沒有幫助的確:)有人碰巧知道爲什麼標準是這樣嗎? – akim

+0

呃,這是cppreference中的一個錯誤,它設置了failbit(之前的[ostream.inserters]/9或/ 8)。儘管OP的結果是一樣的。 – Cubbi

+0

@Cubbi哦,感謝您的糾正。我看到你在那裏修好了;我已經修改了我的答案。我的懶惰不會去標準文本。 –