Книга: Системное программирование в среде Windows

Пример: преобразование символов из ASCII в Unicode

Программа 2.4 достраивает программу 1.3, в которой использовалась вспомогательная функция CopyFile. С копированием файлов вы уже знакомы, поэтому в данном примере эта операция дополняется преобразованием файла к кодировке Unicode в предположении, что первоначальной кодировкой символов является ASCII, хотя проверка этого предположения не производится. В программе предусмотрены некоторые возможности вывода сообщений об ошибках и параметр, позволяющий подавить замену существующего файла; завершающий вызов функции CopyFile заменен в программе вызовом новой функции, которая Выполняет преобразование символьных строк файла из кодировки ASCII в кодировку Unicode.

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

Обратите внимание на вызов функции _taccess, проверяющей существование файла. Эта функция является обобщенной версией функции access, которая имеется в библиотеке UNIX, но не входит в состав стандартной библиотеки С. Ее определение содержится в файле <io.h>. Если говорить точнее, функция _taccess осуществляет проверку прав доступа к файлу в соответствии с режимом, установленным значением второго параметра. Значение 0 задает проверку существования файла, 2 — проверку наличия разрешения на запись в файл, 4 — проверку наличия разрешения на чтение из файла, 6 — проверку наличия разрешения как на чтение из файла, так и на запись в файл (эти значения не связаны напрямую с такими параметрами доступа, используемыми в Windows, как GENERIC_READ). Альтернативой проверке существования файла могло бы быть открытие дескриптора при помощи функции CreateFile и его последующее закрытие после проверки действительности дескриптора. 

Программа 2.4. atou: преобразование файла с выводом сообщений об ошибках 

/* Глава 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) {
   _tprintf(_T("Перезаписать существующий файл? [y/n]"));
   _tscanf(_T ("%s"), &YNResp);
   if (lstrcmp(CharLower(YNResp), YES) != 0) ReportError(_T("Отказ от перезаписи"), 4, FALSE);
  }
 }
 /* Эта функция построена на основе функции CopyFile. */
 Asc2Un(argv[LocFileIn], argv [LocFileOut], FALSE);
 return 0;
}

Программа 2.5 — это вызываемая в программе 2.4 функция Asc2Un, осуществляющая преобразование кодировки символов.

Программа 2.5. Функция Asc2Un

#include "EvryThng.h"
#define BUF_SIZE 256
BOOL Asc2Un(LPCTSTR fIn, LPCTSTR fOut, BOOL bFailIfExists)
/* Функция копирования файлов с преобразованием из ASCII в Unicode. Функция построена на основе функции CopyFile. */
{
 HANDLE hIn, hOut;
 DWORD dwOut, nIn, nOut, iCopy;
 CHAR aBuffer[BUF_SIZE];
 WCHAR uBuffer [BUF_SIZE];
 BOOL WriteOK = TRUE;
 hIn = CreateFile(fin, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); 
 /* Определить поведение функции CreateFile, если выходной файл уже существует. */
 dwOut = bFailIfExists ? CREATE_NEW : CREATE_ALWAYS;
 hOut = CreateFile(fOut, GENERIC_WRITE, 0, NULL, dwOut, FILE_ATTRIBUTE_NORMAL, NULL);
 while (ReadFile(hIn, aBuffer, BUF_SIZE, &nIn, NULL)  && nIn > 0 && WriteOK) {
  for (iCopy = 0; iCopy < nIn; iCopy++)
   /* Преобразовать каждый символ. */
   uBuffer[iCopy] = (WCHAR)aBuffer [iCopy];
  WriteOK = WriteFile(hOut, uBuffer, 2 * nIn, &nOut, NULL);
 }
 CloseHandle(hIn);
 CloseHandle(hOut);
 return WriteOK;
}

Оглавление книги

Оглавление статьи/книги

Генерация: 1.248. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз