setvbuf
| Определено в заголовочном файле <stdio.h>
|
||
int setvbuf( FILE* stream, char* buffer,
int mode, size_t size );
|
(до C99) | |
int setvbuf( FILE* restrict stream, char* restrict buffer,
int mode, size_t size );
|
(начиная с C99) | |
#define _IOFBF /* unspecified */
#define _IOLBF /* unspecified */
#define _IONBF /* unspecified */
|
||
Изменяет режим буферизации заданного файлового потока stream в соответствии с аргументом mode. Кроме того,
- Если
bufferявляется нулевым указателем, изменяет размер внутреннего буфера наsize. - Если
bufferне является нулевым указателем, предписывает потоку использовать предоставленный пользователем буфер размераsize, начинающийся сbuffer. Поток должен быть закрыт (с помощью fclose) до того, как закончится время жизни массива, на который указываетbuffer. Содержимое массива после успешного вызоваsetvbufявляется неопределённым, и любая попытка его использовать приводит к неопределённому поведению.
Параметры
| stream | - | файловый поток, для которого устанавливается буфер | ||||||
| buffer | - | указатель на буфер для использования потоком или нулевой указатель для изменения только размера и режима | ||||||
| mode | - | режим буферизации для использования. Может принимать одно из следующих значений:
| ||||||
| size | - | размер буфера |
Возвращаемое значение
0 при успехе или ненулевое значение при неудаче.
Примечания
Эту функцию можно использовать только после того, как stream был связан с открытым файлом, но до любой другой операции (кроме неудачного вызова setbuf/setvbuf).
Не все size байтов обязательно будут использоваться для буферизации: фактический размер буфера обычно округляется вниз до кратного 2, кратного размеру страницы и т.д.
Во многих реализациях построчная буферизация доступна только для потоков ввода с терминала.
Распространённая ошибка — установка буфера для stdin или stdout на массив, время жизни которого заканчивается до завершения программы:
int main(void)
{
char buf[BUFSIZ];
setbuf(stdin, buf);
} // lifetime of buf ends, undefined behavior
Размер буфера по умолчанию BUFSIZ считается наиболее эффективным размером буфера для файлового ввода/вывода в данной реализации, но POSIX fstat часто даёт более точную оценку.
Пример
Один из случаев использования изменения размера буфера — когда известен лучший размер. (В этом примере используются некоторые функции POSIX, например fileno. См. также SO: #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
Ссылки
- Стандарт C23 (ISO/IEC 9899:2024):
- 7.21.5.6 Функция setvbuf (стр.: TBD)
- Стандарт 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++ для setvbuf
| |