Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Unicode открытие файла, ... для новичка 
:(
    Опции темы
VoAnt
Дата 30.11.2005, 11:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Задача открыть текстовый файл в UTF8.

Ниже приведённый код не работает, почему?

showmassage выводит пустые сообщения....

Код

procedure TForm1.SpeedButton1Click(Sender: TObject); 
var 
  SDF : Text; // <----- Думаю что ошибка где-то тут :)
    i :integer; 
  ws: WideString;
  LineDataFileString : array of string;
begin 

assignfile(SDF, 'sd.txt'); 
reset(SDF); 
i := 0; 

while not EOF(SDF) do begin 
SetLength(LineDataFileString, Length(LineDataFileString) + 1); 

readln(SDF, ws); 

LineDataFileString[i] :=  WideCharToString(PWideChar(ws)); 
showmessage(LineDataFileString[i]); 

i := i + 1; 
end; 

closefile(SDF); 
end;


Это сообщение отредактировал(а) VoAnt - 30.11.2005, 12:05
PM MAIL ICQ   Вверх
Alexeis
Дата 30.11.2005, 12:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



SDF : Text; не text а TextFile


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
VoAnt
Дата 30.11.2005, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Изменил, результат тот же --Resize_Images_Alt_Text--

Код


procedure TForm1.SpeedButton1Click(Sender: TObject); 
var 
  SDF : TextFile; // <----- Думаю что ошибка где-то тут :) изменено c Text на TextFile
    i :integer; 
  ws: WideString;
  LineDataFileString : array of string;
begin 

assignfile(SDF, 'sd.txt'); 
reset(SDF); 
i := 0; 

while not EOF(SDF) do begin 
SetLength(LineDataFileString, Length(LineDataFileString) + 1); 

readln(SDF, ws); 

LineDataFileString[i] :=  WideCharToString(PWideChar(ws)); 
showmessage(LineDataFileString[i]); 

i := i + 1; 
end; 

closefile(SDF); 
end;



Это сообщение отредактировал(а) VoAnt - 30.11.2005, 12:06
PM MAIL ICQ   Вверх
Alexeis
Дата 30.11.2005, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



readln(SDF, ws);
readln вероятно не преднозначена для WideString


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
VoAnt
Дата 30.11.2005, 12:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Хм... А альтернативы есть? Или нужно переписывать код в целом?
PM MAIL ICQ   Вверх
Alexeis
Дата 30.11.2005, 12:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 109
Всего: 459



вот пример конветртирования unicode файла при помощи потоков
Код

procedure TForm1.Button3Click(Sender: TObject);
 var
   S1 : WideString;
   s2 : AnsiString;
   I  : Integer;
   
   inpf   : TFileStream;
   outpf  : TFileStream;

   FileSize : Cardinal;

begin
  if opendialog1.Execute
  then
    Begin
      inpf     := TFileStream.Create(opendialog1.FileName, fmOpenRead);
      FileSize := GetFileSize(inpf.Handle ,nil);
      SetLength(S1 ,FileSize div 2);
      inpf.ReadBuffer((@S1[1])^, FileSize);
      inpf.Destroy;

      outpf   := TFileStream.Create(opendialog1.FileName,
                           fmCreate or fmOpenWrite or fmShareDenyNone);

      s2 := WideCharToString(PWideChar(s1));
      i := 1;
      
      While i < Length(s2)
      do
        Begin
          if (s2[i] = #10) and (s2[i - 1] <> #13)
          then
            Insert(#13, s2, i);
          inc(i)
        end;

      Outpf.WriteBuffer((@S2[1])^, FileSize div 2 - 1);
      Outpf.Destroy;
  end;
end;



--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
VoAnt
Дата 30.11.2005, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Огромное спасибо! Работает !!!!!

Поднял бы Репутацию, но уже 1 ГОД как не могу .. запрещено админом smilesmilesmile .. Забыли наверное убрать бан smile ...

Это сообщение отредактировал(а) VoAnt - 30.11.2005, 12:20
PM MAIL ICQ   Вверх
VoAnt
Дата 5.12.2005, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Так. Продолжаю ТЕму по мере поступления информации smile

Код

...
 var str : string;
...

str := str + 'HI ALL ' + #13#10;
str := str + 'HI NO ALL ' + #13#10;
str := str + 'HI 2 ME' + #13#10;
...



Как содержимое str сохранить в текстовый файл формата UNICODE (CP_UTF8)
PM MAIL ICQ   Вверх
Snowy
Дата 5.12.2005, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Аналогично - переворачивешь все стринки через StringToWideChar и WideChar пишешь в поток.
Поток создавать с флагом fmCreate.
PM MAIL   Вверх
VoAnt
Дата 5.12.2005, 14:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



ws := WideString(StringToWideChar(str,???,???)); <-- недостаточно параметров, что писать нужно?

----
сорьки за ламоцкие вопросы, пытаюсь разобратся полностью

Это сообщение отредактировал(а) VoAnt - 5.12.2005, 15:05
PM MAIL ICQ   Вверх
Snowy
Дата 5.12.2005, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



IMHO так:
Код

function StrToWideChar(str: string): WideChar;
var
  p:  PWideChar;
  sz: integer;
begin
  sz:=Length(str) * 2 +1;
  GetMem(p, sz);
  StringToWideChar(str, p, sz);
  result:=p^;
  FreeMem(p);
end;

PM MAIL   Вверх
VoAnt
Дата 5.12.2005, 17:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Делаю так

Код

...
 var str : string;
       ws : WideString;
...

str := str + 'HI ALL ' + #13#10;
str := str + 'HI NO ALL ' + #13#10;
str := str + 'HI 2 ME' + #13#10;
...

ws := WideString(StrToWideChar(str)); 

Outpf := TFileStream.Create(opendialog1.FileName,fmCreate or fmOpenWrite or fmShareDenyNone);
Outpf.WriteBuffer((@ws)^,length(ws));
Outpf.Destroy;





в файл кидается только первая буква "H"

Где ошибка ? Помогите плз!!

Это сообщение отредактировал(а) VoAnt - 5.12.2005, 17:25
PM MAIL ICQ   Вверх
Snowy
Дата 5.12.2005, 17:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

Репутация: 192
Всего: 484



Попробуй заменить в объявлениях WideString и WideChar на string.
PM MAIL   Вверх
VoAnt
Дата 5.12.2005, 18:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



не работает smile
PM MAIL ICQ   Вверх
VoAnt
Дата 5.12.2005, 19:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Решилось!!!

var
S1 : String;
S2 : WideString;

begin

S2 := S1;

end;

Все, автопереформатирование ! smile


Всем спасибо! Тему можно закрывать!

Это сообщение отредактировал(а) VoAnt - 5.12.2005, 19:59
PM MAIL ICQ   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




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


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

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