2011-12-12 16 views
5

Sto utilizzando una libreria condivisa le cui funzioni stanno facendo std :: cout ovunque. È possibile fare qualsiasi cosa a livello del chiamante in cui posso sopprimere l'output cout o reindirizzare in qualche luogo?Soppressione dell'uscita cout con una funzione

È persino possibile tentare una cosa del genere in C++.

+2

Suppongo che si possa [freopen] (http://www.cplusplus.com/reference/clibrary/cstdio/freopen/) 'stdout' prima e dopo ogni chiamata alla libreria condivisa. Le prestazioni e l'infilatura potrebbero essere una preoccupazione a seconda delle esigenze. – Joe

+1

È possibile utilizzare 'std :: cout.rdbuf()' per reindirizzare l'output in un file, ad esempio. – lapk

+0

Anche questa libreria condivisa non sembra di qualità commerciale. Se hai il codice sorgente per questa libreria dovresti ricompilarlo con la registrazione disabilitata. Una libreria responsabile consentirà che ciò avvenga in un unico punto utilizzando una definizione del preprocessore. – Joe

risposta

4

Qualcosa di simile, basta creare wrapper di funzione per le chiamate in biblioteca che reindirizzano 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); 
} 
+1

c'è qualche differenza di prestazioni tra l'uso di rdbuf e di freeopen? Quale sarebbe un approccio migliore? – Jithin

+0

@Jithin La mia comprensione era che 'cout' deve essere reindirizzato prima di ogni chiamata di funzione della libreria, non solo una volta. In questo caso, 'rdbuf()' è il più veloce, penso, - imposta semplicemente un puntatore, dopo aver aperto il file una volta. Se 'cout' deve essere reindirizzato una sola volta, allora entrambi i modi (' rdbuf' o 'freopen') sono essenzialmente gli stessi. – lapk

0

Si può sempre filtrare tutto l'I/O creando una classe per gestire l'output. Dato che la classe potrebbe essere utilizzata a livello di applicazione, una classe statica potrebbe essere in ordine, ma è possibile creare un'istanza della classe come necessario.

Oltre a scrivere qualcosa o no per coutare o anche scegliere un output diverso, basato sulla stringa argomento, la classe potrebbe anche formattare il testo in base al tipo di output scelto.

Ho guardato su ostream e non ho visto alcun modo per modificare direttamente il cout. Hai riscontrato un bisogno che è emerso prima, quindi spero che qualcun altro a leggerlo possa avere idee migliori sulla creazione della classe che ho suggerito.