CodeNet / Языки программирования / C / C++ / Руководства и справочные материалы по C/C++ / Справочники по функциям / Справочник по библиотечным функциям языка Си
setvbuf - установить буфер в/в
Описание
Функция setvbuf определяет тип и размер буфера, исполь- зуемого для потока. В дополнение к параметрам функции, следующая глобальная переменная воздействует на пове- дение этой функции: _okbigbuf Эта переменная используется только в T, S и M моделях памяти и управляет размещением буферов, когда buf ра- вен NULL. Эта перемнная статически инициализируется в 0 или 1 программистом (по умолчанию в библиотеке ус- танавливается значение 1). Если _okbigbuf равна 1 и модель памяти T, S или M, то setvbuf() пытается рас- положить буфер вне сегмента данных. Если это не выпол- няется и size <= BUFSIZ, setvbuf() пытается разместить буфер внутри сегмента данных. Буфер, который находится вне сегмента данных, помеча- ется установкой флага _IOBIGBUF в fpД>_flags. Если _okbigbuf равна 0 или модель памяти C или L, то setvbuf() пытается разместить буфер внутри сегмента данных. Буфер, размещенный посредством setvbuf(), по- мечается установкой флага _IOMYBUF в fpД>flags. Смот- рите параграф под названием Глобальные Переменные для более подробной информации по _okbigbuf. Параметры функции следующие: fp Указатель на поток, который уже открыт, но в котором еще не было никаких операций чтения или записи. buf Указатель на буфер или NULL. Если NULL, то setvbuf() использует malloc() или farmalloc(), чтобы попытаться разместить буфер размером size байт. Если buf не равен NULL, он указыва- ет на буфер, который setvbuf() будет связывать с потоком fp. mode Режим; должен быть одним из следующих значений: _IONBF Нет буферизации. Параметры buf и size игнорируются. Небуферизованный ввод/вы- вод означает, что записанные данные немедленно передаются в DOS. Когда дан- ные читаются, считывается столько, сколько требуется. _IOLBF Выполняется строчная буферизация. Ре- ально ввод/вывод выполняется, когда читается или записывается новая строка. _IOFBF Полная буферизация. Данные считываются сразу целым буфером. Данные записыва- ются только по заполнению буфера. size Если buf равен NULL, то size - это число бай- тов размещаемого буфера. Если buf не равен NULL, то size должен быть числом байтов в бу- фере, на который указывает buf.
Использование
#include <stdio.h> /* ANSI */ int setvbuf(FILE *fp, char *buf,int mode,size_t size);
Возвращаемое значение
При успешном завершении различные поля, на которые ссылается fp, модернизируются, чтобы указывать на бу- фер и возвращается 0. Если недостаточно памяти под бу- фер или параметр mode недопустим, возвращается ненуле- вое значение.
Пример
#include <stdio.h> main(argc, argv) int argc; char *argv[]; { FILE *fp; static char buf [100]; /* сделаем stdprn небуферизованным */ setvbuf(srdprn, NULL, _IONBF, 0); fprintf(stdprn, "unbuffered\n"); if (argc == 2) /* есть один аргумент */ fp = fopen(argv[1], "w"); else fp = stdout; /* используем стандартный вывод */ if (setvbuf(fp,buf,_IOLBF,sizeof(buf))) printf("setvbuf сработал неудачно\n"); else { fprintf(fp, "Это передается в fp\n"); fclose(fp); } }
Рекомендация
Смотрите также setbuf.