MS-DOS для программиста

Программа BUFCOPY


В качестве примера приведем текст программы BUFCOPY (листинг 3.7), копирующей содержимое текстового файла.

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

Листинг 3.7. Файл bufcopy\ bufcopy.cpp

#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];

int main(int argc, char *argv[]) { time_t start, end; FILE *stream_from, *stream_to;

if(argc < 3) { printf("Задайте имена файлов!\n"); return(-1); }

// Открываем файлы и используем для копирования // буфер стандартного размера if((stream_from = fopen (argv[1], "rt")) == NULL) { printf("Задайте имя входного файла!\n"); return(-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) return(-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) return(-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);

return(0); }

// Функция для копирования файлов void filecpy(FILE *stream_from, FILE *stream_to) { char linebuf[256];

// Цикл копирования. Условие выхода из цикла - // достижение кнеца входного файла while(!feof(stream_from)) { // Читаем в буфер linebuf одну строку if(fgets (linebuf, 255, stream_from) == NULL) break;

// Записываем содержимое буфера linebuf // в выходной файл if(fputs (linebuf, stream_to) != 0) break; }

// Закрываем входной и выходной файлы fclose (stream_from); fclose (stream_to); }


Содержание раздела