Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Работа с файловой системой DOS.doc
Скачиваний:
1
Добавлен:
16.11.2019
Размер:
299.01 Кб
Скачать

Void setbuf(file *stream, char *buffer);

Параметр buffer должен указывать на подготовленный пользователем массив, имеющий размер BUFSIZ байтов. Константа BUFSIZ описана в файле stdio.h.

Функция setvbuf() позволяет программе не только указать свой буфер, но и задать его размер:

Int setvbuf(file *stream, char *buffer, int mode,

size_t size);

Параметр stream должен указывать на открытый поток, причем для этого потока до вызова функции setvbuf() нельзя выполнять операции чтения/записи.

Параметр buffer должен указыват на подготовленный программой буфер размером size байтов. Этот буфер будет использоваться для работы с потоком stream.

Параметр mode может иметь значения _IOFBF, _IOLBF, _IONBF. Если mode равно _IOFBF или _IOLBF, параметр size указывает размер буфера. Если параметр mode равен _IONBF, буферизация не используется, парметры buffer и size игнорируются.

Параметры _IOFBF и _IOLBF эквивалентны.

Если в качестве адреса буфера buffer задать значение NULL, функция автоматически закажет буфер размером size.

Функция setvbuf() возвращает ноль при успешном завершении и ненулевую величину, если указан неправильный парметр mode или неправильный размер буфера size.

Для чего может понадобиться изменение размера буфера?

Главным образом - для сокращения времени, необходимого для позиционирования магнитных головок при выполнении операций одновременно над несколькими файлами, например, при копировании файлов, слиянии нескольких файлов в один и т.д.

При закрытии потока функцией fclose() содержимое буфера записывается на диск. Если программе необходимо выполнить запись содержимого буфера на диск без закрытия файла, она может воспользоваться функцией fflush():

Int fflush(file *stream);

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

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

В качестве примера приведем текст программы, копирующей содержимое текстового файла. Программа копирует этот файл три раза. В первый раз одна использует буфер стандартного размера, затем увеличивает размер буфера в десять раз, и, наконец, копирует файл без использования механизма буферизации. Каждый раз программа измеряет продолжительность копирования файла с помощью функции clock(), входящей в состав стандартных библиотек трансляторов Microsoft QC 2.5 и C 6.0.

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

Void filecpy(file *stream_from, file *stream_to);

// Буфера для файлов

char buf1[BUFSIZ * 10];

char buf2[BUFSIZ * 10];

Void main(int argc, char *argv[]) {

time_t start, end;

FILE *stream_from, *stream_to;

if(argc < 3) {

printf("Задайте имена файлов!\n");

exit(-1);

}

// Открываем файлы и используем для копирования

// буфер стандартного размера

if((stream_from = fopen(argv[1], "rt")) == NULL) {

printf("Задайте имя входного файла!\n");

exit(-1);

}

stream_to = fopen(argv[2], "wt+");

// Определяем время начала копирования

start = clock();

// Выполняем копирование файла

filecpy(stream_from,stream_to);

// Определяем время завершения копирования

end = clock();

// Выводим время копирования при использовании

// буферов стандартного размера

printf("Время копирования: %5.1f Размер буфера, байтов: %d\n",

((float)end - start) / CLK_TCK, BUFSIZ);

// Задаем свой буфер большего размера

if((stream_from = fopen(argv[1], "rt")) == NULL) exit(-1);

stream_to = fopen(argv[2], "wt+");

// Устанавливаем буфера как для входного,

// так и для выходного файлов

setvbuf(stream_from, buf1, _IOFBF, sizeof(buf1));

setvbuf(stream_to, buf2, _IOFBF, sizeof(buf2));

// Копируем файл и измеряем продолжительность

// копирования

start = clock();

filecpy(stream_from,stream_to);

end = clock();

printf("Время копирования: %5.1f Размер буфера: %d\n",

((float)end - start) / CLK_TCK, BUFSIZ * 10);

// Копируем без использования буферизации

if((stream_from = fopen(argv[1], "rt")) == NULL) exit(-1);

stream_to = fopen(argv[2], "wt+");

setvbuf(stream_from, NULL, _IONBF, 0);

setvbuf(stream_to, NULL, _IONBF, 0);

start = clock();

filecpy(stream_from,stream_to);

end = clock();

printf("Время копирования: %5.1f Буферизация не используется\n",

((float)end - start) / CLK_TCK);

exit(0);

}

// Функция для копирования файлов