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 . Содержимое массива после успешного вызова 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); } // время жизни 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>
)
|
|
Документация C
для
setvbuf
|
|