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?

È stato utile?

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top