Пример: копирование нескольких файлов на стандартное устройство вывода

Пример: копирование нескольких файлов на стандартное устройство вывода

В программе 2.3 иллюстрируется использование стандартных устройств ввода/вывода, а также демонстрируется, как улучшить контроль ошибок и усовершенствовать взаимодействие с пользователем. Эта программа представляет собой вариант ограниченной реализации команды UNIX cat, которая копирует один или несколько заданных файлов (или содержимое буфера стандартного устройства ввода, если файлы не указаны) на стандартное устройства вывода.

Программа 2.3 включает полную обработку ошибок. В большинстве других примеров проверка ошибок опущена или сведена к минимуму, но полностью включена в завершенные документированные варианты программ, находящиеся на Web-сайте. Обратите внимание на функцию Options (ее листинг приведен в приложении А), вызываемую в начале программы. Эта функция, которая включена в состав программ, находящихся на Web-сайте, и используется на протяжении всей книги, просматривает параметры в командной строке и возвращает индекс массива argv, соответствующий имени первого файла. Функция Options аналогична функции getopt, которая используется во многих программах в UNIX.

Программа 2.3. cat: вывод нескольких файлов на стандартное устройство вывода 

/* Глава 2. cat. */

/* cat [параметры] [файлы] Допускается только параметр –s, предназначенный для подавления вывода сообщений об ошибках в случае, если один из указанных файлов не существует. */

#include "EvryThng.h"

#define BUF_SIZE 0x200

static VOID CatFile(HANDLE, HANDLE);

int _tmain(int argc, LPTSTR argv[]) {

 HANDLE hInFile, hStdIn = GetStdHandle(STD_INPUT_HANDLE);

 HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

 BOOL DashS;

 int iArg, iFirstFile;

 /* Переменная DashS будет установлена только в случае задания параметра "-s" в командной строке. */

 /* iFirstFile — индекс первого входного файла в списке argv[]. */

 iFirstFile = Options(argc, argv, _T("s"), &DashS, NULL);

 if (iFirstFile == argc) { /*Отсутствие входных файлов в списке аргументов.*/

  /* Использовать стандартное устройство ввода. */

  CatFile(hStdIn, hStdOut);

  return 0;

 }

 /* Обработать каждый входной файл. */

 for (iArg = iFirstFile; iArg < argc; iArg++) {

  hInFile = CreateFile(argv [iArg], GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

  if (hInFile == INVALID_HANDLE_VALUE && !DashS) ReportError (_T("Cat: ошибка при открытии файла"), 1, TRUE);

  CatFile (hInFile, hStdOut);

  CloseHandle (hInFile);

 }

 return 0;

}

/* Функция, выполняющая всю работу:

/* читает входные данные и копирует их на стандартное устройства вывода. */

static VOID CatFile(HANDLE hInFile, HANDLE hOutFile) {

 DWORD nIn, nOut;

 BYTE Buffer [BUF_SIZE];

 while (ReadFile(hInFile, Buffer, BUF_SIZE, &nIn, NULL) && (nIn != 0) && WriteFile(hOutFile, Buffer, nIn, &nOut, NULL));

 return;

}

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

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

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

Процесс вывода на внешнее устройство

Из книги Pinnacle Studio 11 автора Чиртик Александр Анатольевич

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


Пример: преобразование файлов с использованием перекрывающегося ввода/вывода и множественной буферизации

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

Пример: преобразование файлов с использованием перекрывающегося ввода/вывода и множественной буферизации Программа 2.4 (atou) осуществляла преобразование ASCII-файла к кодировке UNICODE путем последовательной обработки файла, а в главе 5 было показано, как выполнить такую же


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

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

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


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

Из книги Firebird РУКОВОДСТВО РАЗРАБОТЧИКА БАЗ ДАННЫХ автора Борри Хелен

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


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

Из книги Искусство программирования на языке сценариев командной оболочки автора Купер Мендель

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


Пример 12-5. copydir, копирование файлов из текущего каталога в другое место, с помощью xargs

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

Пример 12-5. copydir, копирование файлов из текущего каталога в другое место, с помощью xargs #!/bin/bash# Копирует все файлы из текущего каталога# в каталог, указанный в командной строке.if [ -z "$1" ] # Выход, если каталог назначения не задан.then echo "Порядок использования: `basename $0` directory-to-copy-to"


Пример 19-3. Запуск нескольких процессов в подоболочках

Из книги Мир InterBase. Архитектура, администрирование и разработка приложений баз данных в InterBase/FireBird/Yaffil автора Ковязин Алексей Николаевич

Пример 19-3. Запуск нескольких процессов в подоболочках (cat list1 list2 list3 | sort | uniq > list123) & (cat list4 list5 list6 | sort | uniq > list456) & # Слияние и сортировка двух списков производится одновременно. # Запуск в фоне гарантирует параллельное исполнение. # # Тот же эффект


Устройство ввода-вывода

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

Устройство ввода-вывода Вообще говоря, существует много способов ведения диалога человека с ЭВМ, но мы будем предполагать, что вы вводите команды при помощи клавиатуры и читаете ответ на экране


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

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

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


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

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

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


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

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

Копирование файлов сервера Здесь приведен пример для установки InterBase архитектуры SuperServer, как наиболее распространенный случай. При установке сервера копируются файлы, список которых и место назначения приведены в табл. 4.2.Табл 4.2. Файлы для установки


8.1.3. Поиск среди нескольких файлов

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

8.1.3. Поиск среди нескольких файлов Если в текущем каталоге требуется найти последовательность символов "sort" во всех файлах с расширением doc, выполните такую команду:$ grep sort *.docСледующая команда осуществляет поиск фразы "sort it" во всех файлах текущего каталога:$ grep "sort it"