2015-11-20 2 views
4

Il est une méthode bien connue pour copier un flux dans un autre en utilisant rdbuf:flux de copie avec rdbuf échoue sur l'entrée vide

#include <iostream> 
#include <fstream> 

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

Cependant, cette pause (= définit le mauvais bit) mon cerr quand /tmp/foo.txt est vide . Par conséquent, Done\n n'est pas affiché.

Pourquoi? Observé avec G ++/libstdC++/GNU Linux et Clang ++/libC++/OS X.

Répondre

3

Cela semble être le comportement défini - voir par ex. http://en.cppreference.com/w/cpp/io/basic_ostream/operator_ltlt:

Si aucun caractère ont été insérés, setstate exécute (failbit)

Je suis d'accord, il est un peu inutile.

+0

Totalement inefficace en effet :) Quelqu'un pourrait-il savoir pourquoi la norme est de cette façon? – akim

+0

Ugh, c'était un bug dans cppreference, il définit failbit ([ostream.inserters]/9, ou/8 plus tôt). Le résultat est le même pour OP cependant. – Cubbi

+0

@Cubbi Oh, merci pour la correction. Je vois que vous l'avez fixé là; J'ai modifié ma réponse. La paresse de ma part ne va pas au texte standard. –