Модераторы: feodorv, GremlinProg, xvr, Fixin
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Reading Unicode text file, In Unicode program 
:(
    Опции темы
devmstr
Дата 25.9.2006, 17:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 28.4.2004
Где: Ukraine

Репутация: нет
Всего: 11



Есть у меня простенький текстовый файл(ANSII) состоящий из одной строки - "Hello World".
Перед первым символом получаемой строки в str появился какой-то непонятный символ.
Что я не так делаю?
Код

#include <windows.h>
#include <Winnls.h>
bool LoadData(const TCHAR* pth, TCHAR* str)
{
    HANDLE hFile = CreateFile(pth, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hFile == INVALID_HANDLE_VALUE)
    {
        return FALSE;   
    }
    DWORD dwFlSz;
    DWORD dwRead;
    dwFlSz = GetFileSize(hFile, NULL);
    delete[] str;

    void* pbuff = new byte[dwFlSz + 1];
    (*((byte*)pbuff + dwFlSz)) = 0;

    ReadFile(hFile, pbuff, dwFlSz, &dwRead, NULL);

    if (IsTextUnicode(pbuff, dwFlSz, NULL))
    {   
        MessageBox(NULL, __TEXT("It is unicode"), __TEXT(""), 0);
        str = new TCHAR[dwFlSz/sizeof(TCHAR) + 1];
        *(str + dwFlSz/sizeof(TCHAR)) = 0;
        SetFilePointer(hFile, 0, 0, FILE_BEGIN);
        ReadFile(hFile, str, dwFlSz, &dwRead, NULL);
    }
    else
    {
        MessageBox(NULL, __TEXT("It is ANSII"), __TEXT(""), 0);


        dwRead  = 0;
        int tmp = 0;
        tmp = MultiByteToWideChar(CP_ACP, 0, (char*)pbuff, -1, NULL, tmp);
        str = new TCHAR[tmp + 1];
        MultiByteToWideChar(CP_ACP, 0, (char*)pbuff, -1, str, tmp);
    }
    MessageBox(NULL, str, __TEXT(""), 0);
    CloseHandle(hFile);
    return TRUE;
}

INT WINAPI WinMain(HINSTANCE hInst, HINSTANCE hPrevInst, LPSTR lpCmdLine, INT nCmdShow)
{
    TCHAR* st = new TCHAR[1];
    LoadData(__TEXT("c:\\Development\\hello2.txt"), st);
    return 0;
}



--------------------
Think different ©Steve Jobs 
user posted image
PM MAIL WWW   Вверх
CaptainFlint
Дата 25.9.2006, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Искатель сокровищ
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 26.2.2003
Где: Москва

Репутация: 1
Всего: 23



Первый символ в большинстве Unicode-файлов - маркер FF FE, определяющий, что это именно юникодный файл, а также показывающий порядок байт в этом файле (little-endian, big-endian). По всей видимости, у тебя отображается именно он.


--------------------
Почему же, ё-моё, ты нигде не пишешь "ё"?
--------------------
Для тех, кто не знает: CaptainFlint - это бывший Константин. ;) 
PM MAIL WWW ICQ   Вверх
devmstr
Дата 25.9.2006, 17:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Developer
**


Профиль
Группа: Участник
Сообщений: 879
Регистрация: 28.4.2004
Где: Ukraine

Репутация: нет
Всего: 11



CaptainFlint
Спасибо что просветили!!
Тоесть, его можно просто игнорить и все?

А при созранении Unicode строки в файл, мне его нудно в ручную добавлять?


--------------------
Think different ©Steve Jobs 
user posted image
PM MAIL WWW   Вверх
CaptainFlint
Дата 25.9.2006, 17:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Искатель сокровищ
**


Профиль
Группа: Участник
Сообщений: 393
Регистрация: 26.2.2003
Где: Москва

Репутация: 1
Всего: 23



Цитата(devmstr @  25.9.2006,  18:36 Найти цитируемый пост)
Тоесть, его можно просто игнорить и все?

Для работы непосредственно с текстом - да. Только надо учитывать, что может встретиться юникодный файл без этого маркера, и не стереть первый символ, который в этом случае окажется первым символом текста.

Цитата(devmstr @  25.9.2006,  18:36 Найти цитируемый пост)
А при созранении Unicode строки в файл, мне его нудно в ручную добавлять?

Очень желательно. Юникодные файлы без маркера - вещь не очень хорошая. smile


--------------------
Почему же, ё-моё, ты нигде не пишешь "ё"?
--------------------
Для тех, кто не знает: CaptainFlint - это бывший Константин. ;) 
PM MAIL WWW ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Системное программирование и WinAPI"
Fixin
GremlinProg
xvr
feodorv
  • Большое количество информации и примеров с использованием функций WinAPI можно найти в MSDN
  • Описание сообщений, уведомлений и примеров с использованием компонент WinAPI (BUTTON, EDIT, STATIC, и т.п.), можно найти в MSDN Control Library
  • Непосредственно, перед созданием новой темы, проверьте заголовок и удостоверьтесь, что он отражает суть обсуждения.
  • После заполнения поля "Название темы", обратите внимание на наличие и содержание панели "А здесь смотрели?", возможно Ваш вопрос уже был решен.
  • Приводите часть кода, в которой предположительно находится проблема или ошибка.
  • Если указываете код, пользуйтесь тегами [code][/code], или их кнопочными аналогами.
  • Если вопрос решен, воспользуйтесь соответствующей ссылкой, расположенной напротив названия темы.
  • Один топик - один вопрос!
  • Перед тем как создать тему - прочтите это .

На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы .


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема »


 




[ Время генерации скрипта: 0.0729 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.