2010-11-25 5 views
3

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 

Répondre

1

Essayez std::cerr.unsetf(std::ios_base::unitbuf);. Ce drapeau est activé par défaut pour cerr.

+0

Voir ma mise à jour à la question, comment peut-unitbuf être activé sur le nouvel exemple? –

+0

@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

+0

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é. –

1

Le drapeau ios :: unitbuf est la raison de ce qui est défini par défaut pour cerr.

Vous devez utiliser le manipulateur nounitbuf pour le réparer. Certaines bibliothèques plus anciennes peuvent ne pas l'avoir, si c'est le cas, utilisez unsetf.

Edit: Réglage par défaut pour unitbuf dépend de l'implémentation :)

Questions connexes