Autor Téma: Textový súbor v ANSI kódovaní  (Přečteno 7391 krát)

Offline < z >

  • Administrátoři
  • Guru
  • *****
  • Příspěvků: 1145
  • Karma: 44
    • Verze Delphi: 7, 2010
Re:Textový súbor v ANSI kódovaní
« Odpověď #15 kdy: 19-03-2014, 11:04:03 »
... kdyby sis nevsiml ... jeste jsem ti to prepsal na "modernejsi" variantu - mas tam i nacitani, i ulozeni ;)

Offline Ondřej Pokorný

  • Guru
  • *****
  • Příspěvků: 815
  • Karma: 59
    • Verze Delphi: Primárně Lazarus, jinak D7 až aktuální
    • Kluug.net
Re:Textový súbor v ANSI kódovaní
« Odpověď #16 kdy: 19-03-2014, 11:37:38 »
Tak me to je jasny, ze se to bude chovat ruzne :)
Jen jsem nechtel brat bazuku na komara ...

Tak aby byli vsichni stastni

Kdepak, to je už konečně aspoň systematicky správně! A jednoduché to je taky dost, žádná bazuka...

Dvě poznámky:
1.) Máš ten soubor třikrát v paměti - jednou v TMemoryStream, pak v proměnné s a pak ho konvertuješ. Pro práci se soubory tu je TFileStream, není důvod ho nepoužít - a tak si ušetřít aspoň paměť nutnou pro TMemoryStream:

Kód: [Vybrat]
procedure TForm1.Button8Click(Sender: TObject);
var
  s: AnsiString;
  f: TFileStream;
begin
  // load
  f := TFileStream.Create('S:\test-ansi.txt', fmOpenRead or fmShareDenyNone);
  try
     SetLength(s, f.Size);
     f.ReadBuffer(PAnsiChar(s)^, f.Size);
     Memo1.Lines.Text:=AnsiToUtf8(s);
  finally
    f.Free;
  end;

  // save
  f := TFileStream.Create('S:\test-ansi-2.txt', fmCreate);
  try
     s:=Utf8ToAnsi(Memo1.Lines.Text);
     f.WriteBuffer(PAnsiChar(s)^, length(s));
  finally
    f.Free;
  end;
end;

Ale opět ten soubor máš v paměti dvakrát, protože ho konvertuješ celý najednou. Moje řešení s OTextReadWrite/OEncoding ho načítá a konvertuje po částech přes stejný buffer, takže je v paměti jen jednou. To je ale pro malé soubory vlastně jedno...

2.) Funkci TStream.Write() není vhodné takto používat, protože ignoruješ návratovou hodnotu (počet bytů, které zapsala). Pro takové věci se používá TStream.WriteBuffer(), která to ošetřuje.
Embarcadero Technology Partner

Offline Slavomir

  • Mladík
  • **
  • Příspěvků: 58
  • Karma: 0
    • Verze Delphi: XE2 + 10.3 Community Edition
    • RQ Money
Re:Textový súbor v ANSI kódovaní
« Odpověď #17 kdy: 19-03-2014, 12:09:52 »
Citace
... kdyby sis nevsiml ... jeste jsem ti to prepsal na "modernejsi" variantu - mas tam i nacitani, i ulozeni ;)
Skúsil som obidve funkcie, je to výborné!
Ešte raz ďakujem za pomoc.

(Nerozumiem, prečo toto nemá Lazarus ošetrené nejakou funkciou ...)  :o
Lazarus, Delphi - RQ Money