Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [C++] Запись/чтение Unicode-строк из файла


Автор: Pilligrim 14.3.2007, 21:31
Имеется строка формата Unicode. Ее нужно записать в файл и считать ее из него же. Помогите пожалуйста!

Автор: Alexeis 15.3.2007, 15:51
Какая строка wchar_t* или wstring (STL) ?

Автор: Pilligrim 15.3.2007, 20:58
Alexeis wchar_t*. Проблема не в том чтобы ПРОСТО записать, а чтобы записать правильно и считать правильно. Собственно проблема с русскимим символами: они записываются как-то неправильно... не те вообще записываются что я записывал!
 С английскими все нормально.

Автор: Alexeis 16.3.2007, 00:35
Pilligrim, запись в файл должна производиться в текстовом режиме или бинарном?
Если есть код приведите его. Думаю проблема не в записи, а конвертировании ANSI -> UNICODE при отображении или наоборот при копировании из не юникодных контролов. 

Автор: Pilligrim 16.3.2007, 21:16
Привожу код:
Код


HWND hwndLB;//ListBox

enum CACHE_TYPE
    {BASE_END,//Reserved: обозначает конец базы файлов
     BASE_BEGIN,//Reserved
     FILE_LINK,
     TEXT_FRAG
    };

struct CACHE
    {CACHE_TYPE type;
     wchar_t* string;
    };
//Save_DATA сохраняет базу данных
void wSave_DATA(LPWSTR file_name)
        {HANDLE file;
     DWORD writebytes_len;
          bool writeresult;
     DWORD str_len;
     int item_data;
     CACHE* lpcache;
     UINT item_num;
     int base_end;
            
     if(file_name==NULL) return;

     file = CreateFile(file_name,GENERIC_WRITE,FILE_SHARE_WRITE,NULL,CREATE_ALWAYS,FILE_         ATTRIBUTE_NORMAL,NULL);
     if(file==INVALID_HANDLE_VALUE) return;

     for(item_num=0;;item_num++)
             {item_data=SendMessageW(hwndLB,LB_GETITEMDATA,item_num,item_num); 
               
             if(item_data == LB_ERR) break;

             lpcache = (CACHE*)item_data;
               
             writebytes_len = sizeof(lpcache->type);
             writeresult = WriteFile(file,&lpcache->type,writebytes_len,&writebytes_len,NULL);
             if(writeresult && writebytes_len==0)
                      break;

             str_len = lstrlenW(lpcache->string);
             str_len = str_len*sizeof(TCHAR);
             writebytes_len = sizeof(str_len);
             writeresult = WriteFile(file,&str_len,writebytes_len,&writebytes_len,NULL);
             if(writeresult && writebytes_len==0)
                 break;

                  writebytes_len = str_len;
             writeresult = WriteFile(file,lpcache->string,writebytes_len,&writebytes_len,NULL);
             if(writeresult && writebytes_len==0)
            break;
             lpcache = NULL;
             }
     base_end = BASE_END;
     writebytes_len = sizeof(base_end);
     writeresult = WriteFile(file,&base_end,writebytes_len,&writebytes_len,NULL);
     SetEndOfFile(file);
     CloseHandle(file);
    }

//Load_DATA загружает базу данных     
bool wLoad_DATA(LPWSTR file_name)
       {HANDLE file;
         wchar_t data[MAX_PATH];
         CACHE_TYPE type;
         DWORD readbytes_len;
         bool readresult;
         DWORD str_len;

         if(file_name==NULL) return false;
         if(!wCheckFileType((LPWSTR)file_name,L"fls") && !wCheckFileType((LPWSTR)file_name,L"bfr")) 
             return false;          
         file = CreateFile(file_name,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_                ATTRIBUTE_NORMAL,NULL);
         if(file==INVALID_HANDLE_VALUE) return false;
         SendMessageW(hwndLB,LB_RESETCONTENT,0,0);

         readbytes_len = 4;               
         readresult = ReadFile(file,&type,readbytes_len,&readbytes_len,NULL);          
         while(1)
                 {readbytes_len = sizeof(type);               
                 readresult = ReadFile(file,&type,readbytes_len,&readbytes_len,NULL);
                 if(readresult && readbytes_len==0) 
              {CloseHandle(file);
                return true;}

                 if(type==BASE_END) 
                       {CloseHandle(file);
                         return true;}

                 readbytes_len = sizeof(str_len);               
                 readresult = ReadFile(file,&str_len,readbytes_len,&readbytes_len,NULL);
                 if(readresult && readbytes_len==0) 
                       {CloseHandle(file);
                         return true;}
               
                 str_len = str_len*sizeof(TCHAR);
                 readbytes_len = str_len;
                 readresult = ReadFile(file,data,readbytes_len,&readbytes_len,NULL);
                 if(readresult && readbytes_len==0) 
                         {CloseHandle(file);
                           return true;}
                 data[readbytes_len] = 0x0000;
                 wAdd_DATA(type,data);
                 }
    CloseHandle(file);
    return true;
}



Код прямо из проги вырвал. Если какие-нить переменные не объявлены - спрашивайте.

Автор: Pale_Master 17.3.2007, 01:26
1. 
Цитата

SendMessageW(hwndLB,LB_GETITEMDATA,item_num,item_num)

Если контрол был создан через CreateWindowA, то и отправлять сообщения ему нужно через ASCII функции.

2. Загрузка данных из файла вроде верная..

3. Не совсем понятна задача, реализуемая программой. Если нужно заполнить ListBox строками из файла, то это совсем не так нужно делать, если же нет - предоставь больше кода.

Автор: Pilligrim 17.3.2007, 20:32
Задача: 
Нужно присвоить lParam'у ListBox'а указатель на структуру CAHCE. 
В CACHE:
CACHE_TYPE type - тип данных хранящихся в струтуре(адрес файла, текст)
wchar_t* string - собственно данные структуры(адрес файла, текст)
В общем, это реализация базы файлов. Типа прога быстрого запуска: выбрал из списка - запустил))

Цитата

Если контрол был создан через CreateWindowA, то и отправлять сообщения ему нужно через ASCII функции.


Все создаю верно, проверил))) В памяти, когда прога работает, все хранится правильно, ТОЧНО. Все затирается при записи... Сам не пойму: все ведь верно блин...

Автор: Pilligrim 18.3.2007, 19:50
Всем спасибо! 

Проблемы оказывается и не было, это все Блокнот виндовский. Он виноват!!! Он юникод каряво понимает как-то... 

Все ОК)))

Автор: Alexeis 18.3.2007, 23:17
Цитата(Pilligrim @  18.3.2007,  19:50 Найти цитируемый пост)
Проблемы оказывается и не было, это все Блокнот виндовский. Он виноват!!! Он юникод каряво понимает как-то... 

Он его хорошо понимает, если первые 4 байта файла это сигнатура юникода.  smile 

Автор: Pilligrim 21.3.2007, 20:55
Цитата
Он его хорошо понимает, если первые 4 байта файла это сигнатура юникода


С этим похоже трабл и был)))

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