Void setbuf (file *имя_указателя, char *буфер);
Данная функция связывает поток с буфером, который должен быть массивом символов (размером «BUFSIZ» байт).
Константа BUFSIZ содержится в «stdio.h» и равна 512 байт. Если буфер равен null, то доступ к открытому файлу, на который ссылается указатель *имя_указателя, будет небуферизированный, иначе будет использоваться область памяти размером 512 байт, начиная с адреса, заданного указателем *буфер.
ПРИМЕЧАНИЕ
|
Функция setbuf() используется в случае, когда необходимо выключить буферизацию полностью или когда в качестве буфера нужно использовать область памяти программы размером 512 байт. |
Пример:
#include <stdio.h>
main ()
{
FILE *fp;
char mybuf [BUFSIZ];
fp=fopen (“dat.txt”, ”w”);
. . .
setbuf (fp,mybuf);
. . .
}
После этого все операции ввода-вывода для потока fp будут выполняться через буфер mybuf, а не через системный буфер.
Для отключения буферизации потока fp нужно в вызове функции «setbuf (fp,mybuf);» вместо «mybuf» написать «null».
Пример:
#include <stdio.h>
main ()
{
FILE *fp;
char mybuf [BUFSIZ];
fp=fopen (“dat.txt”, ”w”);
. . .
setbuf (fp,null);
. . .
}
Формат:
Int setbuf (file *имя_указателя, char *буфер, int тип_буфериз, unsigned размер);
Данная функция позволяет назначить потоку буфер любого размера (но не более 64 кбайт) или увеличить автоматически назначенный размер буфера потоку.
Аргумент тип_буфериз определяет тип буферизации потока и может принимать одно из константных значений:
_IOFBF - поток буферизируется
_IONBF - поток не буферизируется
_IOLBF - поток является построчно буферизируемым, т.е. при каждом «\n» происходит выгрузка буфера.
В случае успеха функция возвращает ноль и не ноль в противном случае.
Пример:
FILE *fp;
char *buf;
unsigned int n;
. . .
setvbuf (fp, buf, _IOFBF, n); // назначение буфера размером n
setvbuf (fp, buf, _IONBF, n); // отмена буферизации
Если в качестве buf использовать «null», то буфер будет распределяться обращением к функции malloc().
Пример: setvbuf (fp, null, _IOFBF, 8192);
Стандартные потоки stderr и stdaux не буферизируются, но, используя функцию буферизации, их можно сделать буферизированными. Потокиstdin, stdout и stdprn по умолчанию буферизируются. Буфер выгружается, когда он заполнен или когда завершена функция, вызвавшая ввод-вывод.
ВНИМАНИЕ
|
При аварийном завершении буфер не выгружается! |
Кроме автоматической выгрузки буфера, его можно выгрузить в любое время с помощью функций fflush() или flushall().
Формат:
int fflush (FILE *имя_указателя);
Данная функция выгружает буфер открытого потока, на который ссылается указатель *имя_указателя. При этом поток остается открытым.Возвращает в случае успеха ноль и EOF - при ошибке
Формат:
int flushall (void);
Данная функция выгружает все буфера связанные с открытыми потоками. Потоки остаются открытыми. Возвращает целое число открытых входных и выходных потоков.
13.6. Ввод-вывод нижнего уровня |
Ввод-вывод нижнего уровня относится к небуферизированному неформатированному unix-подобному вводу-выводу.
Функции ввода-вывода нижнего уровня прямо вызывают средства ОС. Прототипы этих функций находятся в файле «io.h». Эти функции называются функциями системных вызовов или процессами нижнего уровня [60].
С файловыми открывающимися функциями нижнего уровня связывается дескриптор файла, который представляет собой число, которое использует ОС для ссылки на этот файл.
13.6.1. Открытие файла |
Функции открытия файла:
create () – функция создает новый файл или перезаписывает существующий
open () – функция открывает существующий файл
Формат: