c++ - stdin stdout c programming
Redirige tanto cout como stdout a una cadena en C++ para pruebas unitarias (4)
Estoy trabajando para obtener algún código heredado en pruebas unitarias y, a veces, la única forma de detectar el comportamiento de un programa existente es desde la salida de la consola.
Veo muchos ejemplos en línea de cómo redirigir stdout a otro archivo en C ++, pero ¿hay alguna manera de redirigirlo a una secuencia en memoria para que mis pruebas no dependan del disco?
Me gustaría obtener cualquier cosa que el código heredado envíe a stdout en std :: string para que pueda encontrar fácilmente el resultado.
Editar
El código heredado es tan malo que los usuarios tienen una mezcla de cout << ..
y printf
. Esto es lo que tengo hasta ahora:
void TestSuite::setUp(void)
{
oldStdoutBuf = std::cout.rdbuf();
std::cout.rdbuf(consoleOutput.rdbuf());
}
void TestSuite::tearDown(void)
{
std::cout.rdbuf(oldStdoutBuf);
}
El problema es que esto no captura la salida usando printf. Me gustaría algo que tenga ambas cosas. ¿Algunas ideas?
Esta puede ser una 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
Esto solo intercepta la salida almacenada en el búfer, por lo que sigue yendo a la consola o donde sea.
Espero que esto ayude.
Prueba sprintf, eso es más eficiente.
int i;
char str[] = "asdf";
char output[256];
sprintf(output, "asdfasdf %s %d/n", str, i);
Puede usar freopen(..., stdout)
y luego volcar el archivo en la memoria o std::string
.
std::stringstream
puede ser lo que estás buscando.
ACTUALIZAR
Bien, esto es un poco de hack, pero tal vez podrías hacer esto para obtener la salida printf:
char huge_string_buf[MASSIVE_SIZE];
freopen("NUL", "a", stdout);
setbuf(stdout, huge_string_buffer);
Tenga en cuenta que debe usar "/ dev / null" para Linux en lugar de "NUL". Eso comenzará a llenar rápidamente a huge_string_buffer. Si desea continuar redirigiendo la salida después de que el búfer está lleno, deberá llamar a fflush (), de lo contrario generará un error. Ver std::setbuf
para más información.