Перенаправить cout и stdout в строку в C ++ для модульного тестирования

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

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

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

Edit

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

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

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

 rraallvv11 мар. 2016 г., 20:56
Ни один из ответов ниже не сработал для меня, у вас есть рабочий пример для этого?

Ответы на вопрос(4)

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

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

Это просто перехватывает буферизованный вывод, так что все равно идет на консоль или куда угодно.

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

 11 мар. 2016 г., 22:10
Я хочу полностью отключить вывод на консоль, сохранив только захваченный буфер, возможно ли это?
 25 февр. 2010 г., 09:39
IOFBF из _IOFBF? Я должен был использовать последний, чтобы заставить это работать

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

int i;
char str[] = "asdf";
char output[256];
sprintf(output, "asdfasdf %s %d\n", str, i);
Решение Вопроса

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

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

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

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

 thelsdj22 июл. 2009 г., 02:36
Вы приняли ваш ответ, так как stringstream был хорошим указателем, и ваш UPDATE примерно такой же, как мы, вероятно, доберемся без написания какого-то чрезвычайно большого запутанного беспорядка, сейчас я думаю, что я просто напишу в файл, и, надеюсь, мне не понадобится вывод printf для многих испытаний.
 16 нояб. 2016 г., 16:07
Посмотрите этот ответ, чтобы избежать "взлома NUL" в системах POSIX:stackoverflow.com/a/19499003/1557062
 14 нояб. 2014 г., 12:01
Работает хорошо, но если я использую несколько модульных тестов, некоторые из них заканчиваются с исключением, потому что буфер уже освобожден и в него записан стандартный вывод. В случае только временного перенаправления в буфер используйтеsetbuf(stdout, NULL); в конце использования.

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

 22 июл. 2009 г., 02:19
В этот момент вы должны поразить операционную систему.
 thelsdj22 июл. 2009 г., 00:35
Я действительно хотел бы пропустить необходимость использования файловой системы. Что-то, что использует только оперативную память, будет лучше.

Ваш ответ на вопрос