Как я могу установить стандартный вывод для полной буферизации в C? - PullRequest
2 голосов
/ 17 марта 2019

В настоящее время первое, что я делаю, прежде чем что-либо печатать в своей программе, - это запускаю setbuf(stdout, _IOFBF);

Однако printf("hello\n"); все равно очистит буфер.

Это плохо, я хочу контролировать, когда он отправляет весь свой текст (в интересах создания "гладкого" анимированного GIF-опыта с текстом ASCII в терминале).

Как я могу сказать моей программе, что я бы хотел, чтобы stdout был полностью буферизован?

Ответы [ 2 ]

3 голосов
/ 18 марта 2019

Вы не можете использовать setbuf таким образом: setbuf(stdout, _IOFBF);.Второй аргумент - это указатель на массив BUFSIZ байтов.

Вместо этого вы должны использовать setvbuf() с потенциально большим размером буфера, прежде чем выполнять какой-либо вывод:

setvbuf(stdout, NULL, _IOFBF, 4096);

Выможет передать фактический массив вместо NULL, но это необязательно, поскольку setvbuf выделит буфер, если вы этого не сделаете, и может сделать это, если вы это сделаете.Вы можете проверить возвращаемое значение, чтобы убедиться, что вызов выполнен успешно.Если по какой-то непредвиденной причине этот вызов завершится неудачно в вашей системе, выходные данные не будут полностью буферизованы.

Вот определение стандарта C:

7.21.5.6 setvbuf функция

Конспект

    #include <stdio.h>
    int setvbuf(FILE * restrict stream,
                char * restrict buf, int mode, size_t size);

Функция setvbuf может использоваться только после того, как поток, на который указывает stream, был связан соткрыть файл и перед любой другой операцией (кроме неудачного вызова setvbuf) в потоке.Аргумент mode определяет способ буферизации stream следующим образом: _IOFBF приводит к полной буферизации ввода / вывода;_IOLBF заставляет ввод / вывод буферизоваться строкой_IONBF вызывает небуферизацию ввода / вывода.Если buf не является нулевым указателем, массив, на который он указывает, может использоваться вместо буфера, выделенного функцией setvbuf, а аргумент size указывает размер массива;в противном случае size может определять размер буфера, выделенного функцией setvbuf.Содержимое массива в любое время является неопределенным.

Возвращает

Функция setvbuf возвращает ноль в случае успеха или ненулевое значение, если для * задано недопустимое значение1047 * или если запрос не может быть выполнен.

0 голосов
/ 18 марта 2019

Вам необходимо использовать setvbuf для установки режима, размера и местоположения буфера:

buffer = malloc(1024);
setvbuf(stdout, buffer, _IOFBF, 1024);

Вы должны убедиться, что ваш буфер достаточно большой, чтобы он никогда не сбрасывался из-за емкости, если вы хотите полностью контролировать очистку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...