La réinitialisation d'un ostream, C ++
Question
J'ai 2 différents ostreams, l'un d'entre eux cerr, en utilisant la même streambuffer, j'ai quelques bibliothèques qui auraient pu modifier cerr en quelque sorte, (drapeaux? Modificateurs de format?).
cerr.rdbuf(&mystreambuffer);
ostream teststream(&mystreambuffer);
cerr << "This " << " is " << " a " << " test";
teststream << "This " << " is " << " a teststream " << " test";
impressions:
This
is
a
test
This is a teststream test
Debugging mystreambuffer
J'ai remarqué que les appels cerr mystreambuffer->sync()
toutes les opérations de <<
alors que teststream ne remet pas du tout.
Si je suis cerr
correcte est juste un ostream standard, alors, pourquoi dois-je voir cette différence dans les temps de rinçage? Comment puis-je réinitialiser en arrière cerr aux opérations de rinçage normales?
EDIT: Je vois que vous les gars commentons sur les unitbuf et étant par défaut dans cerr, mais si elle était par défaut, ne serait-il pas à pas écrire ici aussi
#include <iostream>
int main(){
std::cerr << "This " << " is " << " a cerr " << " test\n";
std::cout << "This " << " is " << " a cout " << " test\n";
}
Cobain /tmp$ ./test
This is a cerr test
This is a cout test
La solution
Essayez std::cerr.unsetf( std::ios_base::unitbuf );
. Ce drapeau est activé pour cerr
par défaut.
Autres conseils
ios :: drapeau unitbuf est la raison de ce qui est réglé par défaut pour cerr.
Vous devez utiliser le manipulateur nounitbuf afin de le corriger. Certaines bibliothèques anciens peuvent ne pas avoir, le cas échéant puis utilisez unsetf.
Edit: Le réglage par défaut pour unitbuf dépend de la mise en œuvre:)