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;
}
Пример: преобразование символов из ASCII в Unicode
Программа 2.4 достраивает программу 1.3, в которой использовалась вспомогательная функция CopyFile. С копированием файлов вы уже знакомы, поэтому в данном примере эта операция дополняется преобразованием файла к кодировке Unicode в предположении, что первоначальной кодировкой символов является ASCII, хотя проверка этого предположения не производится. В программе предусмотрены некоторые возможности вывода сообщений об ошибках и параметр, позволяющий подавить замену существующего файла; завершающий вызов функции CopyFile заменен в программе вызовом новой функции, которая Выполняет преобразование символьных строк файла из кодировки ASCII в кодировку Unicode.
В данной программе основное внимание уделяется обеспечению возможности успешного завершения преобразования. Фактическое выполнение преобразования сосредоточено в единственной функции, вызываемой в самом конце программы. Этот фрагмент, как и аналогичный ему фрагмент предыдущей программы, послужит нам шаблоном и будет вновь использоваться в последующих программах без повторения его исходного кода.
Обратите внимание на вызов функции _taccess, проверяющей существование файла. Эта функция является обобщенной версией функции access, которая имеется в библиотеке UNIX, но не входит в состав стандартной библиотеки С. Ее определение содержится в файле
/* Глава 2. atou – копирование файлов с преобразованием из ASCII в Unicode. */
#include "EvryThng.h"
BOOL Asc2Un(LPCTSTR, LPCTSTR, BOOL);
int _tmain(int argc, LPTSTR argv[]) {
DWORD LocFileIn, LocFileOut;
BOOL DashI = FALSE;
TCHAR YNResp[3] = _T("y");
/* Получить параметры командной строки и индекс входного файла. */
LocFileIn = Options(argc, argv, _T("i"), &DashI, NULL);
LocFileOut = LocFileIn + 1;
if (DashI) { /* Существует ли выходной файл? */
/* Обобщенная версия функции access, осуществляющая проверку существования файла. */
if (_taccess(argv[LocFileOut], 0) == 0) {