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 | - | режим буферизации. Он может принимать одно из следующих значений:
|
||||||
| 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
См. также
| устанавливает буфер для потока файла (функция) |
|
|
[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