Namespaces
Variants

std:: setvbuf

From cppreference.net
< cpp ‎ | io ‎ | c
Определено в заголовке <cstdio>
int setvbuf ( std:: FILE * stream, char * buffer, int mode, std:: size_t size ) ;

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

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

Содержание

Параметры

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

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

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

Примечания

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

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

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

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

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

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

Пример

Одним из случаев изменения размера буфера является ситуация, когда известен более подходящий размер.

#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <sys/stat.h>
int main()
{
    std::FILE* fp = std::fopen("/tmp/test.txt", "w+");
    if (!fp)
    {
        std::perror("fopen");
        return EXIT_FAILURE;
    }
    struct stat stats;
    if (fstat(fileno(fp), &stats) == -1) // POSIX only
    {
        std::perror("fstat");
        return EXIT_FAILURE;
    }
    std::cout << "BUFSIZ is " << BUFSIZ << ", but optimal block size is "
              << stats.st_blksize << '\n';
    if (std::setvbuf(fp, nullptr, _IOFBF, stats.st_blksize) != 0)
    {
        std::perror("setvbuf failed"); // POSIX version sets errno
        return EXIT_FAILURE;
    }
    // Read entire file: use truss/strace to observe the read(2) syscalls used
    for (int ch; (ch = std::fgetc(fp)) != EOF;)
    {}
    std::fclose(fp);
    return EXIT_SUCCESS;
}

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

BUFSIZ is 8192, but optimal block size is 65536

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

устанавливает буфер для файлового потока
(функция)
[virtual]
предоставляет пользовательский буфер или делает этот файловый буфер небуферизованным
(виртуальная защищенная функция-член std::basic_filebuf<CharT,Traits> )