Перенаправить cout и stdout в строку в C ++ для модульного тестирования - PullRequest
27 голосов
/ 22 июля 2009

Я работаю над получением устаревшего кода в модульных тестах, и иногда единственный способ почувствовать поведение существующей программы - это вывод консоли.

Я вижу много примеров в Интернете, как перенаправить стандартный вывод в другой файл в C ++, но есть ли способ, которым я могу перенаправить его в поток в памяти, чтобы мои тесты не полагались на диск?

Я хотел бы получить все, что унаследованный код отправляет в stdout, в std :: string, чтобы я мог легко найти его на выходе.

Редактировать

Устаревший код настолько плох, что он использует смесь cout << .. и printf. Вот что у меня есть:

void TestSuite::setUp(void)
{
    oldStdoutBuf = std::cout.rdbuf();
    std::cout.rdbuf(consoleOutput.rdbuf());
}
void TestSuite::tearDown(void)
{
    std::cout.rdbuf(oldStdoutBuf);
}

Проблема в том, что не захватывает вывод с использованием printf. Я хотел бы что-то, что получает оба. Есть идеи?

Ответы [ 4 ]

14 голосов
/ 22 июля 2009

std::stringstream может быть то, что вы ищете.

UPDATE
Хорошо, это немного хак, но, возможно, вы могли бы сделать это, чтобы получить вывод printf:

char huge_string_buf[MASSIVE_SIZE];
freopen("NUL", "a", stdout);
setbuf(stdout, huge_string_buffer);

Обратите внимание, что вы должны использовать "/ dev / null" для linux вместо "NUL". Это быстро начнет заполнять огромный_стринга_буффера. Если вы хотите продолжить перенаправление вывода после заполнения буфера, вам нужно вызвать fflush (), иначе он выдаст ошибку. См. std::setbuf для получения дополнительной информации.

2 голосов
/ 18 сентября 2009

Это может быть альтернатива:

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

Это просто перехватывает буферизованный вывод, поэтому все равно отправляется на консоль или куда-либо еще.

Надеюсь, это поможет.

2 голосов
/ 22 июля 2009

Вы можете использовать freopen(..., stdout), а затем вывести файл в память или std::string.

0 голосов
/ 20 марта 2013

Попробуйте sprintf, это более эффективно.

int i;
char str[] = "asdf";
char output[256];
sprintf(output, "asdfasdf %s %d\n", str, i);
...