Добавил:
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
2
Добавлен:
31.01.2021
Размер:
11.11 Кб
Скачать

Інформатика — Теорія — Буферизація потоків    Автори

|

Контакти

|

Підсистема допомоги

|

Методичні вказівки

|

Анотація

|

Назад

   ІнформатикаФайловий потік : Буферизація потоківЗміст курсу

Вступ

Теорія

Потокове введення і виведення

Використання дескрипторів файлів

Буферизація потоків

Практика

Лабораторна робота

Версія для друку

  Буферизація потоків      В мові С існує ряд функцій, які дозволяють керувати буферизацією потоків.     Функція setbuf() дозволяє користувачу встановлювати буферизацію вказаного потоку stream. Синтаксис функції:void setbuf(FILE *stream, char *buf);де stream повинне відповідати стандартному або вже відкритому потоку;

buf - покажчик буферу даних.

Якщо значення buf дорівнює NULL, то буферизацію буде відмінено. Інакше, значення аргументу buf буде визначати адресу масиву символів довжини BUFSIZ, де BUFSIZ - розмір буфера (константа, визначена в stdio.h).     Визначений користувачем буфер використовується для буферизованого введення/виведення для вказаного потоку stream замість буферу, що виділяється системою за замовчуванням.     Потоки stderr і stdout за замовчуванням небуферизовані, але для них можна встановлювати буферизацію засобами setbuf.     Примітка. Наслідки буферизації будуть непередбаченими, якщо тільки функція setbuf не викликана зразу вслід за функцією fopen або fseek для заданого потоку. В мові С для керування буферизацією потоків існує ще одна функція: setvbuf(). Вона дозволяє користувачу керувати буферизацією та розміром буфера потоку stream. Синтаксис :int setvbuf(FILE *stream, char *buf, int type, size_t size);.     Потік stream повинен відноситися до відкритого потоку. Якщо значення параметру buf не NULL, то масив, адреса якого задається значенням параметра buf буде використовуватися в якості буфера. Якщо потік буферизується, значення параметра type визначає тип буферизації. Тип буферизації може бути або _IONBF, або _IOFBF, або _IOLBF. Якщо тип рівний _IOFBF або _IOLBF, то значення параметра size використовується як розмір буфера.      Якщо тип рівний _IONBF, то потік небуферизований, і значення параметрів size і buf ігноруються. Допустиме значення параметра size: більше 0 і менше, ніж максимальний розмір цілого (int).

Таблиця 6 - Значення констант буферизації,які визначені у файлі stdio.h

Константа

Значення

 _IOFBF

0

Буферизація на повний об'єм буфера

_IOLBF

1

Порядкова буферизація

_IONBF

2

Потік не буферизується

     Для примусового виштовхування буферу можна використовувати функцію fflush(). Її синтаксис :int fflush(FILE *stream);.Дана функція виштовхує зміст буфера, зв'язаного з потоком stream. Потік залишається відкритим. Якщо потік небуферизований, то виклик функції fflush() не викличе ніяких ефектів. Буфер потоку автоматично виштовхується, коли він заповнюється, коли закривається потік або коли програма завершує своє виконання.

Приклад 7. Робота з буферізацією.#include <stdio.h>#include<conio.h>char outbuf[BUFSIZ];int main(){     clrscr();     setbuf(stdout, outbuf);     puts("This is a test of buffered output.\n\n");     puts("This output will go into outbuf\n");     puts("and won't appear until the buffer\n");     puts("fills up or we flush the stream.\n");     getch();     fflush(stdout);     getch();     return 0;}

Приклад 8. Використання буферізації з файлами.#include <stdio.h>int main(){     FILE *input, *output;     char bufr[512];     input = fopen("file.in", "r+b");     output = fopen("file.out", "w");     if (setvbuf(input, bufr, _IOFBF, 512) != 0)           printf("Помилка встановлення буферизацiї для вхiдного файла\n");     else          printf("Для вхiдного файла встановлено буферизацiю\n");     if (setvbuf(output, NULL, _IOLBF, 132) != 0)          printf("Помилка встановлення буферизацiї для вихiдного файла\n");     else

          printf("Буфер для вихiдного файла встановлено\n");     fclose(input);     fclose(output);     return 0;

}

 © 2008 ХНУРЭ, Інформатики, Сінельнікова Т.Ф., informatika@kture.Kharkov.uaРозроблено за допомогою LERSUS

Соседние файлы в папке content