Вы не можете использовать 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 * или если запрос не может быть выполнен.