Namespaces
Variants

setvbuf

From cppreference.net
< c ‎ | io
Определено в заголовочном файле <stdio.h>
int setvbuf ( FILE * stream, char * buffer,
int mode, size_t size ) ;
(до C99)
int setvbuf ( FILE * restrict stream, char * restrict buffer,
int mode, size_t size ) ;
(начиная с C99)
#define _IOFBF     /*unspecified*/

#define _IOLBF     /*unspecified*/

#define _IONBF     /*unspecified*/

Изменяет режим буферизации данного файлового потока stream в соответствии с аргументом mode . Кроме того,

  • Если buffer является нулевым указателем, изменяет размер внутреннего буфера до size .
  • Если buffer не является нулевым указателем, указывает потоку использовать предоставленный пользователем буфер размером size , начиная с buffer . Поток должен быть закрыт (с помощью fclose ) до окончания времени жизни массива, на который указывает buffer . Содержимое массива после успешного вызова setvbuf не определено, и любая попытка его использования является неопределённым поведением.

Содержание

Параметры

stream - файловый поток, для которого устанавливается буфер
buffer - указатель на буфер для использования потоком или нулевой указатель для изменения только размера и режима
mode - режим буферизации для использования. Может быть одним из следующих значений:
_IOFBF полная буферизация
_IOLBF построчная буферизация
_IONBF отсутствие буферизации
size - размер буфера

Возвращаемое значение

0 при успешном выполнении или ненулевое значение при ошибке.

Примечания

Эта функция может использоваться только после того, как stream был ассоциирован с открытым файлом, но до любой другой операции (кроме неудачного вызова setbuf / setvbuf ).

Не все size байты обязательно будут использованы для буферизации: фактический размер буфера обычно округляется в меньшую сторону до кратного 2, кратного размеру страницы и т.д.

Во многих реализациях буферизация по строкам доступна только для потоков ввода терминала.

Распространённая ошибка — установка буфера stdin или stdout на массив, время жизни которого заканчивается до завершения программы:

int main(void) {
    char buf[BUFSIZ];
    setbuf(stdin, buf);
} // время жизни buf завершается, неопределённое поведение

Размер буфера по умолчанию BUFSIZ считается наиболее эффективным размером буфера для файлового ввода-вывода в данной реализации, однако POSIX fstat часто предоставляет более точную оценку.

Пример

Одним из случаев изменения размера буфера является ситуация, когда известен более подходящий размер. (Этот пример использует некоторые функции POSIX, например fileno . См. также на Stack Overflow: #1 и #2 ).

// Make some POSIX functions, such as `int fileno(FILE*)`, visible:
#define _POSIX_SOURCE
#include <stdio.h>
#include <stdlib.h>
#include <sys/stat.h>
int main(void)
{
    FILE* fp = fopen("/tmp/test.txt", "w+");
    if (fp == NULL)
    {
        perror("fopen");
        return EXIT_FAILURE;
    }
    struct stat stats;
    if (fstat(fileno(fp), &stats) == -1) // POSIX only
    {
        perror("fstat");
        return EXIT_FAILURE;
    }
    printf("BUFSIZ is %d, but optimal block size is %ld\n", BUFSIZ, stats.st_blksize);
    if (setvbuf(fp, NULL, _IOFBF, stats.st_blksize) != 0)
    {
        perror("setvbuf failed"); // POSIX version sets errno
        return EXIT_FAILURE;
    }
    int ch;
    while((ch=fgetc(fp)) != EOF); // read entire file: use truss/strace to
                                  // observe the read(2) syscalls used
    fclose(fp);
    return EXIT_SUCCESS;
}

Возможный вывод:

BUFSIZ is 8192, but optimal block size is 65536

Ссылки

  • Стандарт C17 (ISO/IEC 9899:2018):
  • 7.21.5.6 Функция setvbuf (стр: 225)
  • Стандарт C11 (ISO/IEC 9899:2011):
  • 7.21.5.6 Функция setvbuf (стр. 308)
  • Стандарт C99 (ISO/IEC 9899:1999):
  • 7.19.5.6 Функция setvbuf (стр: 273-274)
  • Стандарт C89/C90 (ISO/IEC 9899:1990):
  • 4.9.5.6 Функция setvbuf

Смотрите также

устанавливает буфер для файлового потока
(функция)
C++ documentation для setvbuf