Функция setvbuf

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

Автор: admin
Дата: 10.09.2012
Поделиться:

Комментарии

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.