J'ai 2 ostreams différents, l'un d'entre eux cerr, en utilisant le même streambuffer, j'ai quelques librairies qui ont peut-être modifié cerr (flags? Format modifiers?).Réinitialisation d'un ostream, C++
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 cerr appelle mystreambuffer->sync()
toutes les opérations <<
alors que teststream ne remet pas du tout.
Si je me trompe cerr
est juste un ostream standard, alors, pourquoi est-ce que je vois cette différence dans les temps de rinçage? Comment puis-je réinitialiser cerr aux opérations de rinçage normales? Je vois que vous commentez unitbuf et que c'est par défaut dans cerr, mais si c'était par défaut, n'écrirait-il pas aussi étape par étape ici?
#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
Voir ma mise à jour à la question, comment peut-unitbuf être activé sur le nouvel exemple? –
@Arkaitz Jimenez: Vider un flux ne signifie pas nécessairement écrire une nouvelle ligne. Ce que le rinçage consiste à transférer les caractères de sortie du tampon interne à la destination finale, par ex. déposer en cas de ofstream. Que fait votre 'mystreambuffer-> sync()'? Est-ce qu'il insère une nouvelle ligne parmi d'autres choses? – usta
Cela fonctionne maintenant avec l'unitbuf supprimé. J'essaye juste de trouver si les librairies que j'utilise définissent unitbuf dans cerr ou si c'est définitivement un défaut. Je vois que la norme dit que cerr n'est pas tamponné, mais l'exemple que j'ai collé ne montre pas un comportement non tamponné. –