Я пытаюсь отключить функцию вывода вывода. Функция передает данные в stdout, поэтому моя идея состояла в том, чтобы получить контроль над буфером stdout и проверить, правильно ли функция правильно записывает правильные данные в буфер.Управление буфером для stdout
setvbuf показалось мне идеальным для достижения этой цели.
Я использовал setvbuf для перенаправления stdout для использования моего собственного указанного буфера.
Я использовал режим потоковой передачи _IOFBF, так что теоретически внутренний флеш происходит только в том случае, если буфер заполнен. BUFSIZ в моей системе имеет размер 8192 байта ... что более чем достаточно для выхода тестируемой функции без внутренней очистки во время вызова.
Мой источник в настоящее время выглядит следующим образом:
char buffer [BUFSIZ] = {0};
/* any outputs before redirecting */
printf("0\n");
/* output any remaining data */
fflush(stdout);
/* redirect to my buffer with full buffering */
setvbuf(stdout,buffer,_IOFBF,BUFSIZ);
/* testcode ... output of the function under test */
printf("1\n");
printf("2\n");
/* output any remaining data */
fflush(stdout);
/* restore internal buffering with line buffering */
setvbuf(stdout,NULL,_IOLBF,BUFSIZ);
/* let us see what is in our buffer */
printf("%s",buffer);
Отладка этот код показывает, что "2 \ п" переписывает "1 \ П" в буфере во время секции testcode (GCC 5.4.0 x64 GNU Libc версии: 2,23)
Выход:
0
1
2
2
Но я ожидал:
0
1
2
1
2
Я буду признателен за любые намеки.
Я не могу воспроизвести ошибку ; Я получаю ожидаемый результат. – Beta
Благодарим за проверку. Не уверен теперь, если это ошибка в обработке клип-буфера в моей системе. Какой компилятор + версия вы использовали для проверки? – marcas756
Возможно, слишком поздно использовать 'setvbuf()'? C11dr 7.21.5.6 2 "Функция setvbuf может использоваться только после того, как поток, на который указывает поток, был связан с открытым файлом ** и перед любой другой операцией ** (кроме неудачного вызова setvbuf) выполняется в потоке «. – chux