C++Builder
  Начало   Форум   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Как ввести данные из файла с именем в unicode  (Прочитано 2495 раз)
KotAlex
Участник


Сказали спасибо: +1/-0
Offline

Сообщений: 3


Как ввести данные из файла с именем в unicode
« : 31 Октябрь 2016, 11:39:14 »

Камрады, прошу небольшой помощи.
  В проекте, сделанном в C++ Builder 6, использовался ввод данных из файлов, построенный на классических функциях
     fopen( ... ) - открытие файла и   fread( ... ) - для ввода блоков байтов из файла.
  Все прекрасно работало, пока файлы имели нормальные имена в Win1251.
Но в последнее время неожиданно пошли файлы, имена которых - в уникодах и чужих кодовых страницах.
И упомянутые функции отказались открывать и вводить такие файлы.
  Спрашивается - что нужно изменить в операциях открытия и ввода таких файлов ? Или - какие функции можно использовать для открытия и ввода файлов с именами в уникодах ?
Записан
Sergey1985
Участник


Сказали спасибо: +8/-1
Offline

Сообщений: 310


Re: Как ввести данные из файла с именем в unicode
« Ответ #1 : 01 Ноябрь 2016, 08:52:07 »

Типы строк пробовал преобразовывать? 
Записан
KotAlex
Участник


Сказали спасибо: +1/-0
Offline

Сообщений: 3


Re: Как ввести данные из файла с именем в unicode
« Ответ #2 : 01 Ноябрь 2016, 11:46:22 »

Цитата: Sergey1985 от 01 Ноябрь 2016, 08:52:07
Типы строк пробовал преобразовывать? 
  Я немного разобрался с проблемой. В Embarcadero прекрасно работает такая конструкция :
Код
 WideString NameFile;
TFileStream * FS;
char * MemFile;
 
if ( OpenDialog1->Execute() )
 {
   NameFile = OpenDialog1->FileName;
 
   FS = new TFileStream( NameFile, fmOpenRead );
 
   if ( FS != NULL )
    {
     MemFile = (char *)malloc( 15 );
     FS->Read( MemFile, 15 );
    }
  }
 
или вот такая :
Код
 FILE * Stream;
WideString NameFile;
char * MemFile1;
 
if ( OpenDialog1->Execute() )
 {
    NameFile =  OpenDialog1->FileName;
    if ( ( Stream = _wfopen( NameFile.c_bstr(), L"rb" ) ) == NULL )
     {
     }
    else
     {
       MemFile1 = (char *)malloc( 55 );
       fread( MemFile1, 55, 1, Stream );
       fclose( Stream );
     }
 
  То есть :
Открывается файл с именем в уникоде и из него вводятся данные.
Но в C++ Builder 6 такое не работает. Причина - OpenDialog1->FileName в C++ Builder 6 имеет тип AnsiString и передача через него уникодового имени файла невозможна, никакие преобразования типов не спасут.
 Задать имя такого файла непосредственно в тексте исходного кода в виде строковой константы "..." невозможно - не позволяет редактор кода.
   Отсюда вопрос - как, все-таки, можно было бы ввести уникодовое имя на вход функции в C++ Buuilder 6 .
Записан
Hex
Участник


Сказали спасибо: +16/-3
Offline

Сообщений: 38


Re: Как ввести данные из файла с именем в unicode
« Ответ #3 : 04 Декабрь 2016, 06:38:41 »

вариант раз - переписать под XE
вариант два - написать dll для прозрачной передачи данных файла.
Записан
KotAlex
Участник


Сказали спасибо: +1/-0
Offline

Сообщений: 3


« Ответ #4 : 08 Декабрь 2016, 11:08:10 »

Цитата: Hex от 04 Декабрь 2016, 06:38:41
вариант раз - переписать под XE
вариант два - написать dll для прозрачной передачи данных файла.

  Спасибо за ответ. Вообще-то, за прошедшее время проблему я решил по первому варианту - перетранслировать проект в Embarcadero с заменой всех типов AnsiString на тип WideString.  Весьма трудоемкий механический труд ручками, ручками ... Но туд уж ничего не поделаешь. Между прочим, для Delphi вообще ничего менять не надо - тип String в Delphi 7 интерпретируется как AnsiString, а в Embarcadero - как WideString, и дело в шляпе ...
   А по второму варианту не понял - что вы имеете в виду под "прозрачной передачей данных файла" ? Поясните поподробней, пожалуйста.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  




....

Powered by SMF 1.1.21 | SMF © 2025, Simple Machines
Страница сгенерирована за 0.05 секунд. Запросов: 20.