Прототип функции 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 байт, режим буферизации — полный. Поэтому, выходные данные в потоке должны записываться на физическое устройство, после того, как будет заполнен буфер.
Комментарии