Redirect sia cout e stdout una stringa in C ++ per il test Unità
-
18-09-2019 - |
Domanda
sto lavorando per ottenere un po 'di codice legacy in unit test e, a volte l'unico modo per percepire un comportamento programma esistente è tra l'uscita della console.
Vedo un sacco di esempi on-line per come reindirizzare stdout a un altro file in C ++, ma c'è un modo per reindirizzare a un flusso in memoria così i miei test non devono fare affidamento sul disco?
Mi piacerebbe ottenere tutto ciò che il codice legacy manda a stdout in uno std :: string così posso facilmente .find sull'uscita.
Modifica
Il codice legacy è così male che gli utenti una miscela di cout << ..
e printf
. Ecco quello che ho finora:
void TestSuite::setUp(void)
{
oldStdoutBuf = std::cout.rdbuf();
std::cout.rdbuf(consoleOutput.rdbuf());
}
void TestSuite::tearDown(void)
{
std::cout.rdbuf(oldStdoutBuf);
}
Il problema è che questo fa non di uscita di cattura utilizzando printf. Vorrei qualcosa che ottiene entrambi. Tutte le idee?
Soluzione
std::stringstream
può essere quello che stai cercando.
Aggiorna
Va bene, questo è un po 'di hack, ma forse si potrebbe fare questo per afferrare l'output printf:
char huge_string_buf[MASSIVE_SIZE];
freopen("NUL", "a", stdout);
setbuf(stdout, huge_string_buffer);
Si noti che si dovrebbe usare "/ dev / null" per Linux al posto di "Nul". Che rapidamente iniziare a riempirsi huge_string_buffer. Se si vuole essere in grado di continuare a reindirizzare l'uscita dopo il buffer è pieno dovrete chiamare fflush (), altrimenti si genera un errore. Vedere std::setbuf
per maggiori informazioni.
Altri suggerimenti
È possibile utilizzare freopen(..., stdout)
e poi scaricare il file in memoria o un std::string
.
Questa potrebbe essere un'alternativa:
char bigOutBuf[8192];
char savBuf[8192];
fflush(stdout);
setvbuf(stdout,bigOutBuf,IOFBF,8192);//stdout uses your buffer
//after each operation
strncpy(savBuf,bigOutBuf,8192);//won't flush until full or fflush called
//...
//at long last finished
setbuf(stdout,NULL);//reset to unnamed buffer
Questa intercetta solo l'uscita tamponata, quindi ancora va a consolare o dovunque.
Spero che questo aiuti.
Prova sprintf, che è più efficiente.
int i;
char str[] = "asdf";
char output[256];
sprintf(output, "asdfasdf %s %d\n", str, i);