Spec-Zone.ru › C++

std::setvbuf

Определён в заголовочном файле <cstdio>
int setvbuf( std::FILE* stream, char* buffer, int mode, std::size_t size );

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

  • Если buffer является нулевым указателем, изменяет размер внутреннего буфера на size.
  • Если buffer не является нулевым указателем, указывает потоку использовать предоставленный пользователем буфер размером size, начинающийся с buffer. Поток должен быть закрыт (с помощью std::fclose) до окончания времени жизни символов в [buffer, buffer + size). Содержимое буфера после успешного вызова 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);
} // lifetime of buf ends, undefined behavior

Предполагается, что размер буфера по умолчанию 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

См. также

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

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/c/setvbuf

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API