Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Чтение из udl файла


Автор: Martin_8 2.2.2008, 23:27
Здравствуйте, помогите, пожалуйста, разобраться.
Имеется udl файл с некой строкой соединения, фактически текстовые данные. Я пытаюсь прочитать этот файл целиком. И вывести хотя бы в memo.
Код


Memo1->Lines->LoadFromFile(GetCurrentDir() + "\\Connection\\ConnectionString.udl");

Пытаюсь прочитать и так:
Код

TStringList *sl = new TStringList;

sl->LoadFromFile(GetCurrentDir() + "\\Connection\\ConnectionString.udl");
ShowMessage(sl->Text);

Но я получаю вместо содержимого файла, лишь несколько символов:
 яю[ , хотя содержимое файла начинается с [oledb]

Подскажите, из-за чего происходит такая ситуация?  Как мне корректно прочитать свой файл ?

Автор: xvr 2.2.2008, 23:43
Цитата(Martin_8 @ 2.2.2008,  23:27)
Здравствуйте, помогите, пожалуйста, разобраться.
Имеется udl файл с некой строкой соединения, фактически текстовые данные. Я пытаюсь прочитать этот файл целиком. И вывести хотя бы в memo.
Код


Memo1->Lines->LoadFromFile(GetCurrentDir() + "\\Connection\\ConnectionString.udl");

Пытаюсь прочитать и так:
Код

TStringList *sl = new TStringList;

sl->LoadFromFile(GetCurrentDir() + "\\Connection\\ConnectionString.udl");
ShowMessage(sl->Text);

Но я получаю вместо содержимого файла, лишь несколько символов:
 яю[ , хотя содержимое файла начинается с [oledb]

Подскажите, из-за чего происходит такая ситуация?  Как мне корректно прочитать свой файл ?

Судя по 'яю[' твой файл записан в Unicode, прямая загрузка через LoadFromFile работать не будет, он расчитан на ASCII  smile 

Автор: Martin_8 3.2.2008, 00:45
xvr
Цитата

Судя по 'яю[' твой файл записан в Unicode, прямая загрузка через LoadFromFile работать не будет, он расчитан на ASCII


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

Автор: xvr 3.2.2008, 10:54
Цитата(Martin_8 @ 3.2.2008,  00:45)
xvr
Цитата

Судя по 'яю[' твой файл записан в Unicode, прямая загрузка через LoadFromFile работать не будет, он расчитан на ASCII


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

Читаешь содержимое файла в строку (как есть), затем на нее натравливаешь функцию Utf8ToAnsi, получаешь в Ansi кодировке


Автор: Martin_8 3.2.2008, 14:02
Пробую читать содержимое файла, как есть, а потом применять Utf8ToAnsi. 

Код

TStringList *sl = new TStringList;

sl->LoadFromFile(GetCurrentDir() + "\\Connection\\ConnectionString.udl");
sl->Text=Utf8ToAnsi(sl->Text);
ShowMessage(sl->Text);


Не получается. В sl->Text пусто!  Подскажите, что я делаю неправильно? Почем не происходит чтение данных ? И как их можно прочитать применительно для моего случая ?  smile 

Автор: xvr 4.2.2008, 18:43
Цитата(Martin_8 @ 3.2.2008,  14:02)
Пробую читать содержимое файла, как есть, а потом применять Utf8ToAnsi. 

Код

TStringList *sl = new TStringList;

sl->LoadFromFile(GetCurrentDir() + "\\Connection\\ConnectionString.udl");
sl->Text=Utf8ToAnsi(sl->Text);
ShowMessage(sl->Text);


Не получается. В sl->Text пусто!  Подскажите, что я делаю неправильно? Почем не происходит чтение данных ? И как их можно прочитать применительно для моего случая ?  smile

TStringList не будет читать Unicode файл  smile Нужно читать прямо в строку:
Код

AnsiString buf;
TFileStream* fs=new TFileStream(GetCurrentDir() + "\\Connection\\ConnectionString.udl",fmOpenRead);
buf=AnsiString::StringOfChar(' ',fs->Size);
fs->ReadBuffer(buf.c_str(),fs->Size);
ShowMessage(Utf8ToAnsi(buf));
delete fs;

Автор: Martin_8 5.2.2008, 01:12
xvr, Спасибо за разъяснения с TStringList, за пример. 
Я считываю прямо в строку, как в вашем примере, но когда выполнение доходит до строчки 
Код

fs->ReadBuffer(buf.c_str(),fs->Size);
 я вижу что в buf.c_str() вместо содержимого моего файла, находятся только те самые символы яю[, и соответственно ShowMessage отображает уже пустую строку.

Сам udl файл присоединен. 
Его содержимое:
Код

[oledb]
; Everything after this line is an OLE DB initstring
Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=ripo_bd_1;Data Source=ROM


Быть может у Вас ещё имеются идеи почему происходит неправильное считывание (вернее оно фактически и не происходит) данных из этого файла ? Что ещё можно предпринять для разрешения этой ситуации ?  smile 

Автор: dumb 5.2.2008, 02:14
Цитата(Martin_8 @  3.2.2008,  14:02 Найти цитируемый пост)
Пробую читать содержимое файла, как есть, а потом применять Utf8ToAnsi
гм. и причем тут Utf8?.. smile

Код

  TStringList *sl = new TStringList;
  TFileStream* fs = new TFileStream(GetCurrentDir() + "\\Connection\\ConnectionString.udl",fmOpenRead);
  char *buf = new char[fs->Size + 2];
  memset(buf, 0, fs->Size + 2);
  fs->ReadBuffer(buf, fs->Size);
  if (*(unsigned short*)buf == 0xFEFF)
    sl->Text = (wchar_t*)buf + 1;
  else
    sl->Text = buf;
//  ShowMessage(sl->Text);
  delete[] buf;
  delete fs;

  Memo1->Lines->AddStrings(sl);

  delete sl;


Автор: xvr 5.2.2008, 08:45
Цитата(Martin_8 @ 5.2.2008,  01:12)
xvr, Спасибо за разъяснения с TStringList, за пример. 
Я считываю прямо в строку, как в вашем примере, но когда выполнение доходит до строчки 
Код

fs->ReadBuffer(buf.c_str(),fs->Size);
 я вижу что в buf.c_str() вместо содержимого моего файла, находятся только те самые символы яю[, и соответственно ShowMessage отображает уже пустую строку.

Сам udl файл присоединен. 
Его содержимое:
Код

[oledb]
; Everything after this line is an OLE DB initstring
Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=ripo_bd_1;Data Source=ROM


Быть может у Вас ещё имеются идеи почему происходит неправильное считывание (вернее оно фактически и не происходит) данных из этого файла ? Что ещё можно предпринять для разрешения этой ситуации ?  smile

Точно, не UTF-8 а чистый Unicode. См. код от dumb - должен работать

Автор: Martin_8 6.2.2008, 02:12
Спасибо dumb и xvr за помощь.  smile 
dumb, Ваш код, это то, что надо   smile 

Автор: artsb 6.2.2008, 11:57
dumb,  напиши коментов к своему коду, плиз.

А тут:
Код

if (*(unsigned short*)buf == 0xFEFF)

ты проверяешь кодировку?

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