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