2010-11-25 3 views
3

Ich habe 2 verschiedene Ostreams, eine davon Cerr, mit dem gleichen streambuffer, ich habe einige Bibliotheken in denen möglicherweise Cerr irgendwie modifiziert haben, (Flags? Format-Modifikatoren?).Zurücksetzen eines Ostreams, C++

cerr.rdbuf(&mystreambuffer); 
ostream teststream(&mystreambuffer); 

cerr << "This " << " is " << " a " << " test"; 
teststream << "This " << " is " << " a teststream " << " test"; 

druckt:

This 
is 
a 
test 
This is a teststream test 

Debuggen mystreambuffer ich bemerkt habe, dass cerr mystreambuffer->sync() jeden << Betrieb ruft während teststream es überhaupt nicht nennen.
Wenn ich richtig bin cerr ist nur ein Standard-Ostream, warum sehe ich dann diesen Unterschied in den Spülzeiten? Wie kann ich cerr wieder auf normale Spülvorgänge zurücksetzen?

EDIT: Ich sehe Sie Jungs kommentieren über Unitbuf und es standardmäßig in Cerr, aber wenn es Standard war, würde es nicht auch hier Schritt für Schritt schreiben?

#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 

Antwort

1

Versuchen Sie std::cerr.unsetf(std::ios_base::unitbuf);. Diese Flagge ist standardmäßig für cerr aktiviert.

+0

Siehe mein Update auf die Frage, wie kann unitbuf auf das neue Beispiel aktiviert werden? –

+0

@Arkaitz Jimenez: Einen Stream zu spülen bedeutet nicht unbedingt, eine neue Zeile zu schreiben. Bei der Spülung werden die Ausgangszeichen vom internen Puffer zum endgültigen Ziel übertragen, z. im Falle von ofstream ablegen. Was macht dein 'mystreambuffer-> sync()'? Wird unter anderem eine neue Zeile eingefügt? – usta

+0

Es funktioniert jetzt mit dem Unitbuf entfernt. Ich versuche nur herauszufinden, ob die Bibliotheken, die ich benutze, das unitbuf in cerr setzen oder ob das definitiv ein Standard ist. Ich sehe, dass der Standard sagt, dass Cerr ungepuffert ist, aber das Beispiel, das ich eingefügt habe, zeigt kein ungepuffertes Verhalten. –

1

Das Flag ios :: unitbuf ist der Grund für den Standardwert von cerr.

Sie müssen den nounitbuf Manipulator verwenden, um es zu beheben. Einige ältere Bibliotheken haben es möglicherweise nicht, wenn ja, dann benutze unsetf.

Edit: Standardeinstellung für unitbuf ist abhängig von der Implementierung :)