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

Программа FCOPY


В качестве примера мы приведем программу копирования файлов FCOPY (листинг 3.4), которая пользуется описанными выше функциями.

Листинг 3.4. Файл fcopy\fcopy.cpp

#include <io.h> #include <conio.h> #include <stdio.h> #include <fcntl.h> #include <sys\types.h> #include <sys\stat.h> #include <malloc.h> #include <errno.h>

int main(int argc, char *argv[]) { int source, taget, i; char *buffer; int count;

if(argc == 3) { // Открываем исходный файл if((source = open (argv[1], O_BINARY | O_RDONLY )) == - 1) { printf("\nОшибка: %d", errno); return(-1); }

// Открываем выходной файл. При необходимости // создаем новый. Если файл уже существует, // выводим на экран запрос на перезапись // содержимого существующего файла taget = open (argv[2], O_BINARY | O_WRONLY | O_CREAT | O_EXCL , S_IREAD | S_IWRITE);

if(errno == EEXIST) { printf("\nФайл существует. " "Перезаписать? (Y,N)\n");

// Ожидаем ответ и анализируем его i = getch(); if((i == 'y') (i == 'Y')) taget = open (argv[2], O_BINARY | O_WRONLY | O_CREAT | O_TRUNC , S_IREAD | S_IWRITE); }

// Если выходной файл открыть невозможно, // выводим сообщение об ошибке // и завершаем работу программы if(taget == -1) { printf("\nОшибка: %d", errno); return(-1); }

// Будем читать и писать за один раз 10000 байт count = 10000;

// Заказываем буфер для передачи данных if((buffer = (char *)malloc(count)) == NULL) { printf("\nМало памяти"); return(-1); }

// Копируем исходный файл while(!eof(source)) { // Читаем count байт в буфер buffer if((count = read (source, buffer, count)) == -1) { printf("\nОшибка при чтении: %d", errno); return(-1); }

// Выполняем запись count байт // из буфера в выходной файл if((count = write (taget, buffer, count)) == - 1) { printf("\nОшибка при записи: %d", errno); return(-1); } }



// Закрываем входной и выходной файлы close (source); close (taget);

// Освобождаем память, заказанную под буфер free(buffer); }


// Если при запуске программы не были указаны // пути для входного или выходного файла, // выводим сообщение об ошибке else printf("\nЗадайте пути для файлов!\n"); return 0; }

Для определения момента достижения конца исходного файла в программе использована функция eof:

int eof(int handle);

Для файла с идентификатором handle эта функция возвращает одно из трех значений:

Значение Описание
1 Достигнут конец файла
0 Конец файла не достигнут
-1 Ошибка, например, неправильно указан идентификатор файла
Программа, которая читает файл с помощью функции 3Fh прерывания INT 21h , может определить момент достижения конца файла анализируя код ошибки, передаваемый в регистре AX.


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