Операционная система MS DOS (том 2)


Чтение/запись файлов - часть 3


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

int source, taget, i; char *buffer; unsigned count;

if(argc == 3) {

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

if((source = open(argv[1], O_BINARY | O_RDONLY)) == - 1) {

printf("\nОшибка при открытии исходного файла: %d", errno); exit(-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); exit(-1); }

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

count = 10000;

// Заказываем буфер для передачи данных

if((buffer = (char *)malloc(count)) == NULL) { printf("\nНедостаточно оперативной памяти"); exit(-1); }

// Копируем исходный файл

while(!eof(source)) {

// Читаем count байтов в буфер buffer

if((count = read(source, buffer, count)) == -1) { printf("\nОшибка при чтении: %d", errno); exit(-1); }

// Выполняем запись count байтов из буфера в выходной файл

if((count = write(taget, buffer, count)) == - 1) { printf("\nОшибка при записи: %d", errno); exit(-1); } }

// Закрываем входной и выходной файлы

close(source); close(taget);

// Освобождаем память, заказанную под буфер

free(buffer); }

// Если при запуске программы не были указаны // пути для входного или выходного файла, // выводим сообщение об ошибке

else printf("\n" "Задайте пути для исходного" " и результирующего файлов!\n"); }

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

int eof(int handle);

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

1 достигнут конец файла;
0 конец файла не достигнут;
-1 ошибка, например, неправильно указан handle.

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




- Начало -  - Назад -  - Вперед -