Прототип функции setvbuf:
int setvbuf( FILE * filestream, char * buffer, int modeopen, size_t size );
Заголовочный файл
| Название | Язык |
|---|---|
| stdio.h | С |
| cstdio | С++ |
Описание
Функция изменяет буфер, который будет использоваться для операций ввода/вывода с указанным потоком. Эта функция позволяет задать режим доступа и размер буфера. Эта функция должна быть вызвана для файла, связанного с потоком, который уже открыт. Причём вызов данной функции должен находиться между операциями открытия и закрытия файла. Размер буфера определяется параметром size, в байтах. Если буфер не определен (т.е. параметр buffer имеет аргумент NULL), система динамически распределяет объем памяти, требуемый функцией setvbuf и использует его в качестве буфера для потока. Параметр modeopen используется, чтобы определить тип буферизации, т. е. использовать полную буферизацию или не использовать её вообще. С полной буферизацией потоков, операция записи не выполняется непосредственно на физическом устройстве, связанные с ними. Вместо этого, данные накапливаются в буфере и записываются в устройство в качестве блока, когда буфер будет заполнен. Эти данные могут быть принудительно очищены, путём вызова функций fflush или fclose. Все буферы и обнуляются также, при завершении работы программы. Буфер записывается на физическое устройство каждый раз, когда встречается символ новой строки. С небуферизованных потоков, данные записываются на физическое устройство как можно скорее, после каждой операции записи. Все файлы открываются с буфером, который выделен по умолчанию. Эта функция может быть использована для отключения буферизации или изменения размера буфера для конкретного потока. Системные стандартные потоки, такие, как стандартный вывод и стандартный поток ошибок являются небуферизованными по умолчанию. Параметры:
- filestream
Указатель на объект типаFILE, который соединён с открытым потоком. - buffer
Выделенный пользователем буфер должен быть размером не менееsizeбайт. Если установлено значениеNULL, функция автоматически выделяет буфер указанного размера. - modeopen
Режимы буферизации файлов:
| _IOFBF | Полная буферизация: На выход, данные записываются после заполнения буфера. Входной буфер заполняется при открытии файла и, если буфер пуст. |
| _IOLBF | Строковая буферизация: На выход, данные записываются, когда символ новой строки вставляется в поток или когда буфер полон. На входе, буфер заполняется до следующего символа новой строки, когда запрашивается операция ввода, при условии, что буфер пуст. |
| _IONBF | Без буферизации: Нет буфер используется. Каждая операция ввода / вывода написано как можно скорее. В этом случае, thebuffer и размер параметры игнорируются. |
- size
Размер буфера в байтах. Если аргумент параметраsize - NULL, то автоматически выделяется минимальный размер буфера, в противном случае оно должно быть равным или меньше размера в байтах массива, заданного в качестве буфера.
Возвращаемое значение
Если буфер корректно указан, возвращается нулевое значение.
В противном случае, возвращается ненулевое значение, которое возникает в результате некорректного указания параметров режима или размера, или, при выделении памяти, если был указан в качестве буфера параметр NULL).
Пример: исходный код программы
//пример использования функции setvbuf
#include <iostream>
#include <cstdio>
int main()
{
FILE *ptrFile = fopen("file.txt", "w");
// для файла file.txt устанавливаем режим полной буфферизации, размер буфера 1024 байт
setvbuf( ptrFile, NULL, _IOFBF, 1024 );
//операции для работы с файлом
fclose (ptrFile);
return 0;
}
Пример работы программы
В этом примере создаётся файл file.txt. Который связан с буферизованным потоком. Размер буфера 1024 байт, режим буферизации — полный. Поэтому, выходные данные в потоке должны записываться на физическое устройство, после того, как будет заполнен буфер.
Комментарии