Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > Reading Unicode text file


Автор: devmstr 25.9.2006, 17:08
Есть у меня простенький текстовый файл(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;
}

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

Автор: devmstr 25.9.2006, 17:36
CaptainFlint
Спасибо что просветили!!
Тоесть, его можно просто игнорить и все?

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

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

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

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)