setvbuf
|
Определено в заголовочном файле
<stdio.h>
|
||
| (до C99) | ||
| (начиная с C99) | ||
|
#define _IOFBF /*unspecified*/
#define _IOLBF /*unspecified*/
|
||
Изменяет режим буферизации данного файлового потока
stream
в соответствии с аргументом
mode
. Кроме того,
-
Если
bufferявляется нулевым указателем, изменяет размер внутреннего буфера доsize. -
Если
bufferне является нулевым указателем, указывает потоку использовать предоставленный пользователем буфер размеромsize, начиная сbuffer. Поток должен быть закрыт (с помощью fclose ) до окончания времени жизни массива, на который указываетbuffer. Содержимое массива после успешного вызоваsetvbufне определено, и любая попытка его использования является неопределённым поведением.
Содержание |
Параметры
| stream | - | файловый поток, для которого устанавливается буфер | ||||||
| buffer | - | указатель на буфер для использования потоком или нулевой указатель для изменения только размера и режима | ||||||
| mode | - |
режим буферизации для использования. Может быть одним из следующих значений:
|
||||||
| size | - | размер буфера |
Возвращаемое значение
0 при успешном выполнении или ненулевое значение при ошибке.
Примечания
Эта функция может использоваться только после того, как
stream
был ассоциирован с открытым файлом, но до любой другой операции (кроме неудачного вызова
setbuf
/
setvbuf
).
Не все
size
байты обязательно будут использованы для буферизации: фактический размер буфера обычно округляется в меньшую сторону до кратного 2, кратного размеру страницы и т.д.
Во многих реализациях буферизация по строкам доступна только для потоков ввода терминала.
Распространённая ошибка — установка буфера stdin или stdout на массив, время жизни которого заканчивается до завершения программы:
Размер буфера по умолчанию BUFSIZ считается наиболее эффективным размером буфера для файлового ввода-вывода в данной реализации, однако POSIX fstat часто предоставляет более точную оценку.
Пример
Одним из случаев изменения размера буфера является ситуация, когда известен более подходящий размер. (Этот пример использует некоторые функции POSIX, например
fileno
. См. также на Stack Overflow:
#1
и
#2
).
// Make some POSIX functions, such as `int fileno(FILE*)`, visible: #define _POSIX_SOURCE #include <stdio.h> #include <stdlib.h> #include <sys/stat.h> int main(void) { FILE* fp = fopen("/tmp/test.txt", "w+"); if (fp == NULL) { perror("fopen"); return EXIT_FAILURE; } struct stat stats; if (fstat(fileno(fp), &stats) == -1) // POSIX only { perror("fstat"); return EXIT_FAILURE; } printf("BUFSIZ is %d, but optimal block size is %ld\n", BUFSIZ, stats.st_blksize); if (setvbuf(fp, NULL, _IOFBF, stats.st_blksize) != 0) { perror("setvbuf failed"); // POSIX version sets errno return EXIT_FAILURE; } int ch; while((ch=fgetc(fp)) != EOF); // read entire file: use truss/strace to // observe the read(2) syscalls used fclose(fp); return EXIT_SUCCESS; }
Возможный вывод:
BUFSIZ is 8192, but optimal block size is 65536
Ссылки
- Стандарт C17 (ISO/IEC 9899:2018):
-
- 7.21.5.6 Функция setvbuf (стр: 225)
- Стандарт C11 (ISO/IEC 9899:2011):
-
- 7.21.5.6 Функция setvbuf (стр. 308)
- Стандарт C99 (ISO/IEC 9899:1999):
-
- 7.19.5.6 Функция setvbuf (стр: 273-274)
- Стандарт C89/C90 (ISO/IEC 9899:1990):
-
- 4.9.5.6 Функция setvbuf
Смотрите также
|
устанавливает буфер для файлового потока
(функция) |
|
|
C++ documentation
для
setvbuf
|
|