Frage Cout-Ausgabe in einer Funktion unterdrücken


Ich benutze eine gemeinsame Bibliothek, deren Funktionen überall std :: cout tun. Ist es möglich, irgendetwas auf der Ebene des Anrufers zu tun, wo ich das Cout Outout unterdrücken oder es an einen Ort umleiten kann?

Ist es überhaupt möglich, so etwas in C ++ zu versuchen?


6
2017-12-12 18:13


Ursprung


Antworten:


So etwas, machen Sie einfach Funktionsumblätter für Ihre Bibliotheksaufrufe, die umleiten würden cout.

int main( void )
{
 std::ofstream lStream( "garbage.txt" );
 std::streambuf* lBufferOld = std::cout.rdbuf();

 std::cout.rdbuf( lStream.rdbuf() );
 std::cout << "Calling library function" << std::endl;

 std::cout.rdbuf( lBufferOld );
 std::cout << "Normal output" << std::endl;

 std::cout.rdbuf( lStream.rdbuf() );
 std::cout << "Calling another library function" << std::endl;

 std::cout.rdbuf( lBufferOld );
 std::cout << "Another normal output" << std::endl;

 lStream.close();

 return ( 0 );
}

4
2017-12-12 18:40



Sie könnten immer alle I / O filtern, indem Sie eine Klasse für die Ausgabe erstellen. Wenn die Klasse anwendungsweit verwendet wird, ist möglicherweise eine statische Klasse in Ordnung, aber Sie können die Instanz der Klasse nach Bedarf instanziieren.

Zusätzlich zum Schreiben von etwas oder nicht zum Ausschneiden oder sogar zum Auswählen einer anderen Ausgabe kann die Klasse basierend auf der Argument-Zeichenkette den Text auch basierend auf der Art der ausgewählten Ausgabe formatieren.

Ich schaute zu Ostream und offhand sah keinen Weg, wie du Cout direkt modifizieren könntest. Du hast ein Bedürfnis entdeckt, das schon einmal aufgetreten ist. Hoffentlich hat jemand, der dies liest, vielleicht bessere Ideen, um die Klasse zu erstellen, die ich vorgeschlagen habe.


0
2017-12-12 18:22