Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекции по вводу-выводу.doc
Скачиваний:
6
Добавлен:
18.09.2019
Размер:
583.17 Кб
Скачать

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

 

 

ВНИМАНИЕ

 

При аварийном завершении буфер не выгружается!

 

 

Кроме автоматической выгрузки буфера, его можно выгрузить в любое время с помощью функций fflush() или flushall().

 

Формат:

            int fflush (FILE *имя_указателя);

           

Данная функция выгружает буфер открытого потока, на который ссылается указатель *имя_указателя. При этом поток остается открытым.Возвращает в случае успеха ноль и EOF - при ошибке

 

Формат:

            int flushall (void);

 

Данная функция выгружает все буфера связанные с открытыми потоками. Потоки остаются открытыми. Возвращает целое число открытых входных и выходных потоков.

 

 

13.6. Ввод-вывод нижнего уровня

 

 

Ввод-вывод нижнего уровня относится к небуферизированному неформатированному unix-подобному вводу-выводу.

 

Функции ввода-вывода нижнего уровня прямо вызывают средства ОС. Прототипы этих функций находятся в файле «io.h». Эти функции называются функциями системных вызовов или процессами нижнего уровня [60].

 

С файловыми открывающимися функциями нижнего уровня связывается дескриптор файла, который представляет собой число, которое использует ОС для ссылки на этот файл.

 

 

13.6.1. Открытие файла

 

 

Функции открытия файла:

create () – функция создает новый файл или перезаписывает существующий

open () – функция открывает существующий файл

           

Формат: