Spec-Zone.ru › C++

std::setvbuf

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

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

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

Параметры

stream - поток файла, для которого необходимо установить буфер
buffer - указатель на буфер для потока или null-указатель для изменения только размера и режима
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
[virtual]
предоставляет буфер, указанный пользователем, или делает этот 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/w/cpp/io/c/setvbuf

Spec-Zone.ru

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