Копирование файлов с использованием стандартной библиотеки С

Копирование файлов с использованием стандартной библиотеки С

Как видно из текста программы 1.1, стандартная библиотека С поддерживает объекты потоков ввода/вывода FILE, которые напоминают, несмотря на меньшую общность, объекты Windows HANDLE, представленные в программе 1.2.

Программа 1.1. срC: копирование файлов с использованием библиотеки С

/* Глава 1. Базовая программа копирования файлов cp. Реализация, использующая библиотеку С. */

/* cp файл1 файл2: Копировать файл1 в файл2. */

#include <stdio.h>

#include <errno.h>

#define BUF_SIZE 256

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

 FILE *in_file, *out_file;

 char rec [BUF_SIZE];

 size_t bytes_in, bytes_out;

 if (argc != 3) {

  printf("Использование: срС файл1 файл2 ");

  return 1;

 }

 in_file = fopen(argv [1], "rb");

 if (in_file == NULL) {

  perror(argv[1]);

  return 2;

 }

 out_file = fopen(argv [2], "wb");

 if (out_file == NULL) {

  perror(argv [2]);

  return 3;

 }

 /* Обработать входной файл по одной записи за один раз. */

 while ((bytes_in = fread(rec, 1, BUF_SIZE, in_file)) > 0) {

  bytes_out = fwrite(rec, 1, bytes_in, out_file);

  if (bytes_out != bytes_in) {

   perror("Неустранимая ошибка записи.");

   return 4;

  }

 }

 fclose (in_file);

 fclose (out_file);

 return 0;

}

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

1. Объекты открытых файлов идентифицируются указателями на структуры FILE (в UNIX используются целочисленные дескрипторы файлов). Указателю NULL соответствует несуществующий объект. По сути, указатели являются разновидностью дескрипторов объектов открытых файлов.

2. В вызове функции fopen указывается, каким образом должен обрабатываться файл — как текстовый или как двоичный. В текстовых файлах содержатся специфические для каждой системы последовательности символов, используемых, например, для обозначения конца строки. Во многих системах, включая Windows, в процессе выполнения операций ввода/вывода каждая из таких последовательностей автоматически преобразуется в нулевой символ, который интерпретируется в языке С как метка конца строки, и наоборот. В нашем примере оба файла открываются как двоичные.

3. Диагностика ошибок реализуется с помощью функции perror, которая, в свою очередь, получает информацию относительно природы сбоя, возникающего при вызове функции fopen, из глобальной переменной errno. Вместо этого можно было бы воспользоваться функцией ferror, возвращающей код ошибки, ассоциированный не с системой, а с объектом FILE.

4. Функции fread и fwrite возвращают количество обработанных байтов непосредственно, а не через аргумент, что оказывает существенное влияние на логику организации программы. Неотрицательное возвращаемое значение говорит об успешном выполнении операции чтения, тогда как нулевое — о попытке чтения метки конца файла.

5. Функция fclose может применяться лишь к объектам типа FILE (аналогичное утверждение справедливо и в отношении дескрипторов файлов UNIX).

6. Операции ввода/вывода осуществляются в синхронном режиме, то есть прежде чем программа сможет выполняться дальше, она должна дождаться завершения операции ввода/вывода.

7. Для вывода сообщений об ошибках удобно использовать входящую в библиотеку С функцию ввода/вывода printf, которая даже будет использована в первом примере Windows-программы.

Преимуществом реализации, использующей библиотеку С, является ее переносимость на платформы UNIX, Windows, а также другие системы, которые поддерживают стандарт ANSI С. Кроме того, как показано в приложении В, в том, что касается производительности, вариант, использующий функции ввода/вывода библиотеки С, ничуть не уступает другим вариантам реализации. Тем не менее, в этом случае программы вынуждены ограничиваться синхронными операциями ввода/вывода, хотя влияние этого ограничения будет несколько ослаблено использованием потоков Windows (начиная с главы 7).

Как и их эквиваленты в UNIX, программы, основанные на функциях для работы с файлами, входящих в библиотеку С, способны выполнять операции произвольного доступа к файлам (с использованием функции fseek или, в случае текстовых файлов, функций fsetpos и fgetpos), но это является уже потолком сложности для функций ввода/вывода стандартной библиотеки С, выше которого они подняться не могут. Вместе с тем, Visual C++ предоставляет нестандартные расширения, способные, например, поддерживать блокирование файлов. Наконец, библиотека С не позволяет управлять средствами защиты файлов.

Резюмируя, можно сделать вывод, что если простой синхронный файловый или консольный ввод/вывод — это все, что вам надо, то для написания переносимых программ, которые будут выполняться под управлением Windows, следует использовать библиотеку С.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Копирование звуковых файлов

Из книги Nero 8 автора Кашеваров А

Копирование звуковых файлов 1. Вставьте в привод компакт-диск, который хотите скопировать, и запустите программу Nero StartSmart.2. Перейдите на вкладку Rip and Burn (Перенос и запись).3. Щелкните кнопкой мыши на задании Rip Audio CD (Перенос аудио-CD). Откроется окно приложения Nero Burning ROM с


19.2.4.3. Придерживайтесь стандартной практики именования файлов

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

19.2.4.3. Придерживайтесь стандартной практики именования файлов Еще до просмотра README-файла бесстрашный исследователь внимательно изучит имена файлов в корневом каталоге распакованного дистрибутива. Имена файлов в нем сами по себе способны нести полезную информацию.


Копирование файлов системы

Из книги Новейший самоучитель работы на компьютере автора Белунцов Валерий

Копирование файлов системы Итак, набор дополнительных программ и компонентов системы для установки выбран. Теперь наступает самая приятная часть установки системы, во время которой вообще ничего делать не надо. Нужно только подождать некоторое время, пока все файлы,


19.2.4.3. Придерживайтесь стандартной практики именования файлов

Из книги Искусство программирования для Unix автора Реймонд Эрик Стивен

19.2.4.3. Придерживайтесь стандартной практики именования файлов Еще до просмотра README-файла бесстрашный исследователь внимательно изучит имена файлов в корневом каталоге распакованного дистрибутива. Имена файлов в нем сами по себе способны нести полезную информацию.


Поиск файлов с использованием регyлярных выражений

Из книги Windows Script Host для Windows 2000/XP автора Попов Андрей Владимирович

Поиск файлов с использованием регyлярных выражений Всем хорошо известно, что для поиска файлов и папок с помощью стандартных средств Windows в именах можно использовать подстановочные символы "?" (обозначает любой один символ) и "*" (обозначает любое число любых символов).


О целесообразности привлечения функций стандартной библиотеки C для обработки файлов

Из книги Системное программирование в среде Windows автора Харт Джонсон М

О целесообразности привлечения функций стандартной библиотеки C для обработки файлов Несмотря на всю уникальность возможностей Windows, старый добрый язык С и его стандартная библиотека ANSI С по-прежнему могут с успехом использоваться при решении большинства задач,


Копирование файлов с использованием Windows

Из книги Сетевые средства Linux автора Смит Родерик В.

Копирование файлов с использованием Windows В программе 1.2 решается та же задача копирования файлов, но делается это с помощью Windows API, а базовые приемы, стиль и соглашения, иллюстрируемые этой программой, будут использоваться на протяжении всей этой книги.Программа 1.2. cpW:


Копирование файлов с использованием вспомогательной функции Windows

Из книги Недокументированные и малоизвестные возможности Windows XP автора Клименко Роман Александрович

Копирование файлов с использованием вспомогательной функции Windows Для повышения удобства работы в Windows предусмотрено множество вспомогательных функций (convenience functions), которые, объединяя в себе несколько других функций, обеспечивают выполнение часто встречающихся задач


Пример: последовательная обработка файлов с использованием метода отображения

Из книги Виртуальная библиотека Delphi автора

Пример: последовательная обработка файлов с использованием метода отображения Программа atou (программа 2.4) иллюстрирует последовательную обработку файлов на примере преобразования ASCII-файлов к кодировке Unicode, приводящего к удвоению размера файла. Этот случай является


Копирование файлов

Из книги автора

Копирование файлов Пять различных вариантов реализации программ копирования файлов использовались для копирования файла размером 25,6 Мбайт (400 000 записей размером 64 байта каждая, сгенерированных с помощью программы RandFile из главы 5). В первых двух столбцах табл. В.1


Копирование файлов сервера

Из книги автора

Копирование файлов сервера Сформировав поддерево chroot, надо скопировать в содержащиеся в нем каталоги требуемые файлы. Набор необходимых файлов зависит от особенностей сервера. Если сервер самостоятельно вызывает функцию chroot(), вам нет необходимости размещать в


Копирование системных файлов

Из книги автора

Копирование системных файлов После того как вы разместите в пределах поддерева chroot файлы сервера, вам следует скопировать в каталоги поддерева некоторые системные файлы. Для работы серверов часто требуются следующие типы файлов.• Библиотеки. Во время работы многие


Копирование файлов

Из книги автора

Копирование файлов Копирование в INF-файлах реализовано наиболее сложно. Для его выполнения необходимо не только использовать ключевое слово CopyFiles, но и, кроме того, создать три отдельных блока INF-файла: DestinationDirs, SourceDisksFiles и SourceDisksNames. Рассмотрим простой пример. Листинг 15.7.


Копирование файлов

Из книги автора

Копирование файлов Как описано ниже в главе "Состав модулей InterBase", минимальный корректный клиент InterBase состоит из трех файлов - gds32.dll, interbase.msg и msvcrt.dll.Опытные специалисты могут заявить, что абсолютный минимум - это библиотека gds32.dll, которую можно положить в тот же каталог, в