Namespaces
Variants

setvbuf

С сайта ru.cppreference.net
 
 
Файловый ввод/вывод
Типы и объекты
        
Функции
Доступ к файлам
(C95)
Неформатированный ввод/вывод
(C95)(C95)
(C95)
(C95)(C95)
(C95)
(C95)

Форматированный ввод
Прямой ввод/вывод
Форматированный вывод
Позиционирование в файле
Обработка ошибок
Операции с файлами
 
Определено в заголовочном файле <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);
} // lifetime of buf ends, undefined behavior

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

Пример

Один из случаев использования изменения размера буфера — когда известен лучший размер. (В этом примере используются некоторые функции POSIX, например fileno. См. также SO: #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

Ссылки

  • Стандарт C23 (ISO/IEC 9899:2024):
  • 7.21.5.6 Функция setvbuf (стр.: TBD)
  • Стандарт 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

Смотри также

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