Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.06.2011, 23:04   #1
StIX-S
Пользователь
 
Регистрация: 24.06.2011
Сообщений: 69
Сообщение Проблема с UNICODE

Всем доброго времени суток! Есть такая задача: Прочитать все строки из файла, при этом удаляя все пробелы, табуляции, всё что после ' ; ' и ' . ', средствами WinAPI.

Сделал так:
Код:
//#define UNICODE

#ifdef UNICODE
    #define PRINT wprintf(TEXT("%S\n"), szBuff)
#else
    #define PRINT printf(TEXT("%s\n"), szBuff)
#endif

#include <windows.h>
#include <stdio.h>

INT main()
{
    // Создаем переменные
    HANDLE hFile;
    TCHAR szBuff[1000];
    DWORD dwBytesRead;
    LPTSTR lpA, lpB;
    BOOL bSkip = FALSE;

    // Открываем файл
    hFile = CreateFile(TEXT("maps.ini"), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

    // Если файл не открыт - выйти
    if (hFile == INVALID_HANDLE_VALUE) return -1;

    // Читаем файл
    ReadFile(hFile, szBuff, 1000, &dwBytesRead, NULL);

    // Закрываем файл
    CloseHandle(hFile);

    // Ставим нуль терминатор
    szBuff[dwBytesRead] = '\0';

    // Парсим строки
    for (lpA = lpB = szBuff; ; ++lpA)
    {
        if (*lpA == ' ' || *lpA == '\t') continue;      // Пропустить пробелы и табуляции
        if (*lpA == ';' || *lpA == '.') bSkip = TRUE;   // Пропустить всё от ';' или '.' до конца строки
        if (*lpA == '\n' || *lpA == '\0')
        {
            bSkip = FALSE;
            if (lpB == szBuff && *lpA != '\0') continue;// Если строка осталась без изменений и не конец файла - пропустить печать строки, вернуться в начало
            *lpB = '\0';                                // Установить нуль терминатор
            PRINT;                                      // Вывод строки
            if (*lpA == '\0') break;                    // Если конец буфера - выйти
            lpB = szBuff;                               // Установить указатель на начало буфера
            continue;
        }
        if (!bSkip) *lpB++ = *lpA;                      // Копировать символ
    }

    return 0;
}
Если компиллировать в UNICODE варианте, то вобще получается полная ерунда, парсинг вобще не идет + добавляется мусор при выводе строк.

Подскажите пожалуйста что не так, возможно у кого-то есть соображения как можно реализовать что описано выше, более лучше и быстрее ?
StIX-S вне форума Ответить с цитированием
Старый 25.06.2011, 00:16   #2
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

Поменять '\0', ' ', '\t' на _T('\0'), _T(' '), _T('\t'). Это же не мультибайтовые, а двухбайтовые строки.
ЗЫ И да, так:
Код:
#ifdef UNICODE
    #define PRINT wprintf(TEXT("%S\n"), szBuff)
#else
    #define PRINT printf(TEXT("%s\n"), szBuff)
#endif
очень плохо делать.

Код:
#ifdef UNICODE
    #define PRINT(str) wprintf(TEXT("%s\n"), str)
#else
    #define PRINT(str) printf(TEXT("%s\n"), str)
#endif

Последний раз редактировалось Carbon; 25.06.2011 в 00:26.
Carbon вне форума Ответить с цитированием
Старый 25.06.2011, 00:36   #3
StIX-S
Пользователь
 
Регистрация: 24.06.2011
Сообщений: 69
По умолчанию Проблема с UNICODE

Переделал вот так:
Код:
#define UNICODE
#define _UNICODE

#ifdef UNICODE
    #define PRINT(str) wprintf(L"%S\n", str)
#else
    #define PRINT(str) printf("%s\n", str)
#endif

#include <windows.h>
#include <tchar.h>
#include <stdio.h>

INT main()
{
    // Создаем переменные
    HANDLE hFile;
    TCHAR szBuff[1000];
    DWORD dwBytesRead;
    LPTSTR lpA, lpB;
    BOOL bSkip = FALSE;

    // Открываем файл
    hFile = CreateFile(_T("maps.ini"), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

    // Если файл не открыт - выйти
    if (hFile == INVALID_HANDLE_VALUE) return -1;

    // Читаем файл
    ReadFile(hFile, szBuff, 1000, &dwBytesRead, NULL);

    // Закрываем файл
    CloseHandle(hFile);

    // Ставим нуль терминатор
    szBuff[dwBytesRead] = _T('\0');

    // Парсим строки
    for (lpA = lpB = szBuff; ; ++lpA)
    {
        if (*lpA == _T(' ') || *lpA == _T('\t')) continue;   // Пропустить пробелы и табуляции
        if (*lpA == _T(';') || *lpA == _T('.')) bSkip = TRUE;// Пропустить всё от ';' или '.' до конца строки
        if (*lpA == _T('\n') || *lpA == _T('\0'))
        {
            bSkip = FALSE;
            if (lpB == szBuff && *lpA != _T('\0')) continue;// Если строка осталась без изменений и не конец файла - пропустить печать строки, вернуться в начало
            *lpB = _T('\0');                                // Установить нуль терминатор
            PRINT(szBuff);                                  // Вывод строки
            if (*lpA == _T('\0')) break;                    // Если конец буфера - выйти
            lpB = szBuff;                                   // Установить указатель на начало буфера
            continue;
        }
        if (!bSkip) *lpB++ = *lpA;                          // Копировать символ
    }

    return 0;
}
А разве есть различие между _T() и TEXT() ? пробовал и так и так, толку нет. Все также не работает. Компилятор MinGW 4.4.1

Насчет этого:

Код:
#ifdef UNICODE
    #define PRINT wprintf(TEXT("%S\n"), szBuff)
#else
    #define PRINT printf(TEXT("%s\n"), szBuff)
#endif
Это всего-лиш пример.

Последний раз редактировалось StIX-S; 25.06.2011 в 00:56.
StIX-S вне форума Ответить с цитированием
Старый 25.06.2011, 01:51   #4
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

А так?
szBuff[dwBytesRead / 2] = _T('\0');

А что значит "парсинг не идёт"?
Carbon вне форума Ответить с цитированием
Старый 25.06.2011, 02:20   #5
alex_x_x
Форумчанин
 
Регистрация: 31.01.2011
Сообщений: 160
По умолчанию

заместов ваших дефайнов _tprintf есть
alex_x_x вне форума Ответить с цитированием
Старый 25.06.2011, 02:31   #6
StIX-S
Пользователь
 
Регистрация: 24.06.2011
Сообщений: 69
Сообщение Проблема с UNICODE

Цитата:
Сообщение от Carbon Посмотреть сообщение
А так?
szBuff[dwBytesRead / 2] = _T('\0');

А что значит "парсинг не идёт"?
Уже лучше, убрался мусор в конце.

Парсинг - разбор строк, удаление пробелов, коментариев и т.п, то, что было описано выше.

Цитата:
Сообщение от alex_x_x Посмотреть сообщение
заместов ваших дефайнов _tprintf есть
Спасибо, я в курсе про этот макрос. Просто в начале я делал без подключения tchar.h, но всеравно формат нужно изменять, с %s на %S ...

Опять таки это не суть вопроса, это просто тестовый код.

Последний раз редактировалось StIX-S; 25.06.2011 в 02:33.
StIX-S вне форума Ответить с цитированием
Старый 25.06.2011, 17:48   #7
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

StIX-S, что должно выводиться и что выводится? На примере.
Carbon вне форума Ответить с цитированием
Старый 25.06.2011, 23:48   #8
StIX-S
Пользователь
 
Регистрация: 24.06.2011
Сообщений: 69
Сообщение Проблема с UNICODE

Пример:

Файл, который читаем:
Код:
; коментарий
; коментарий

  имя_файла.расширение ; коментарий
имя_файла.расширение

    ; коментарий

   текст
  текст ; коментарий
текст
То, что должно быть выведено:
Код:
имя_файла
имя_файла
текст
текст
текст
Тоесть, убираются все пробелы, все коментарии (не зависимо где они, в начале строки или нет.), расширения файлов.
StIX-S вне форума Ответить с цитированием
Старый 26.06.2011, 13:25   #9
Carbon
JAVA BEAN
Участник клуба
 
Аватар для Carbon
 
Регистрация: 22.04.2007
Сообщений: 1,329
По умолчанию

StIX-S, а выводится что?
Carbon вне форума Ответить с цитированием
Старый 26.06.2011, 14:39   #10
StIX-S
Пользователь
 
Регистрация: 24.06.2011
Сообщений: 69
Сообщение Проблема с UNICODE

При компиляции в ANSI выводиться всё как нужно. При компиляции в UNICODE выводится как есть - что прочитано, то и выведено.
StIX-S вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с чтением файлов в Unicode Xeonc Общие вопросы C/C++ 1 09.11.2010 18:45
мусор в UNICODE X-954377 Общие вопросы C/C++ 2 04.07.2010 15:12
Unicode Pedro Общие вопросы Delphi 8 13.03.2009 10:50
Unicode и Delphi BOBAH13 Общие вопросы Delphi 3 27.09.2008 13:08
Unicode }{UTPUU Общие вопросы Delphi 4 02.04.2007 15:21