Autor Téma: Obsah súboru txt - nie je korektný  (Přečteno 595 krát)

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4546
  • Karma: 40
    • Verze Delphi: XE7 professional
Obsah súboru txt - nie je korektný
« kdy: 18-06-2019, 14:59:00 »

Podľa príkladu ms-help://embarcadero.rs_xe7/codeexamples/TWriter_(Delphi).html
Kód: Delphi [Vybrat]
  1. Stream := TFileStream.Create(FileName, fmCreate or fmOpenWrite or fmShareDenyNone);
  2. Writer := TWriter.Create(Stream, $FF);
  3. myStringBuilder := TStringBuilder.Create;
  4. myStringBuilder.Append(sTitle);
  5. myStringBuilder.AppendLine;
  6. ...
  7. Writer.WriteListBegin;
  8. Writer.WriteString(myStringBuilder.ToString);
  9. Writer.WriteListEnd;
  10. Writer.Destroy;
  11. Stream.Destroy;
  12.  
Ale obsah je iný než som tam poslal. PS Pad mi to otvára ako hexa(?). Čo mám zle?
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Morrison

  • Hrdina
  • ****
  • Příspěvků: 278
  • Karma: 12
    • Verze Delphi: D5, XE2
Re:Obsah súboru txt - nie je korektný
« Odpověď #1 kdy: 18-06-2019, 16:41:23 »
Nevím, jen vidím, že prvních 6 bajtů je divných. Přijde mi to jako vadný BOM souboru.
Rovněž bych řekl, že při otevírání streamu bys měl použít buď mód fmCreate nebo fmOpenWrite, ne obojí, i když v té ukázce to tak mají. Mimochodem ta ukázka je výborná ukázka toho, jak kód rozhodně nepsat (žádné ošetření výjimek, volání destruktoru namísto Free atd.)
nil

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4546
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:Obsah súboru txt - nie je korektný
« Odpověď #2 kdy: 18-06-2019, 17:09:47 »
Ten Destroy ma dosť zarazil, ale ešte som to neriešil. Tak isto ani bloky try...
Ten uvedený mód ma tiež zarazil. Ale to určite nemá vplyv na výsledok. Samozrejme to upravím.
Kód: Delphi [Vybrat]
  1. Problem bude v tom, ze volani WriteListBegin zapise do streamu znacku vaList (typu TValueType).
Ako z toho von? Nemám s tým absolútne žiadne skúsenosti ani vedomosti.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2611
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Obsah súboru txt - nie je korektný
« Odpověď #3 kdy: 18-06-2019, 17:15:02 »
Ako z toho von? Nemám s tým absolútne žiadne skúsenosti ani vedomosti.
A nechces se spis pochlubit, o co se vlastne snazis? TWriter a TReader byval nejaky interni pokus Borlandu o proprietarni serializaci objektu, typicky streamovani formularu do .DFM (puvodne jen v binarni podobe).

Jestli chces psat text do souboru, tak prece vubec nic takoveho nepotrebujes  :o

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4546
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:Obsah súboru txt - nie je korektný
« Odpověď #4 kdy: 18-06-2019, 17:51:29 »
Citace
A nechces se spis pochlubit, o co se vlastne snazis?
Ide mi o prosté zapísanie textu, oznamy o chybách, ktorý je uložený v premenných typu string.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4546
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:Obsah súboru txt - nie je korektný
« Odpověď #5 kdy: 18-06-2019, 18:02:16 »
Pozrel som na ten TStringWriter. V ukážke pomocou neho vytvoria string, ktorý potom zobrazia. Ale ja už ten string mám. Len ho zapísať do súboru. Nič viac.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline Jirka

  • Plnoletý
  • ***
  • Příspěvků: 154
  • Karma: 8
    • Verze Delphi: XE2
Re:Obsah súboru txt - nie je korektný
« Odpověď #6 kdy: 18-06-2019, 18:15:53 »
Ide mi o prosté zapísanie textu, oznamy o chybách, ktorý je uložený v premenných typu string.
To se mi zdá vhodnější formát XML  kde si můžeš rovnou zapisovat do elementů (atributů) čas udalosti, místo události , text udalosti atd.
a prohlížet to můžeš v kterémkoliv webbrowseru ..

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2611
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Obsah súboru txt - nie je korektný
« Odpověď #7 kdy: 18-06-2019, 18:20:42 »
Citace
A nechces se spis pochlubit, o co se vlastne snazis?
Ide mi o prosté zapísanie textu, oznamy o chybách, ktorý je uložený v premenných typu string.
A chces to psat do souboru jako Unicode nebo jako ANSI?

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4546
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:Obsah súboru txt - nie je korektný
« Odpověď #8 kdy: 18-06-2019, 18:23:32 »
To je pre užívateľa. Nie je to klasický log. (Na tom ešte len budem pracovať.) Kontrolujem kompletnosť údajov. Ak tam bude viac nedostatkov, tak je jednoduchšie si zobraziť/vytlačiť súbor a postupovať podľa toho. Akonáhle zavrie okno o chybách, tak nevie čo tam bolo.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4546
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:Obsah súboru txt - nie je korektný
« Odpověď #9 kdy: 18-06-2019, 18:25:08 »
Citace
A chces to psat do souboru jako Unicode nebo jako ANSI?
Úplne stačí ANSI. Bude tam len slovenčina. Text správy dávam do kopy v Delphi.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4546
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:Obsah súboru txt - nie je korektný
« Odpověď #10 kdy: 18-06-2019, 18:34:59 »
Fajn, to posledné mi funguje ako má.
Ďakujem.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2611
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Obsah súboru txt - nie je korektný
« Odpověď #11 kdy: 18-06-2019, 19:04:30 »
Citace
A chces to psat do souboru jako Unicode nebo jako ANSI?
Úplne stačí ANSI. Bude tam len slovenčina. Text správy dávam do kopy v Delphi.
Prece muzes psat rovnou do streamu, ten ANSI string takhle (a pro unicode v podstate uplne stejne):
Kód: Delphi [Vybrat]
  1. fs.Write(ansi[1], Length(ansi) * StringElementsize(ansi));

Online Stanislav Hruška

  • Padawan
  • ******
  • Příspěvků: 4546
  • Karma: 40
    • Verze Delphi: XE7 professional
Re:Obsah súboru txt - nie je korektný
« Odpověď #12 kdy: 18-06-2019, 20:07:14 »
Hm, výsledok nie je správny. Ostávam pri tom čo dal Delfin. Už nebudem nad tým špekulovať.
Delphi XE7, FireBird
Expert na kladenie nejasne formulovaných otázok.

Offline pf1957

  • Padawan
  • ******
  • Příspěvků: 2611
  • Karma: 133
    • Verze Delphi: D2007, XE3, DX10
Re:Obsah súboru txt - nie je korektný
« Odpověď #13 kdy: 18-06-2019, 20:26:39 »
Hm, výsledok nie je správny. Ostávam pri tom čo dal Delfin. Už nebudem nad tým špekulovať.
No protoze to zapisujes jako Unicode a ne ANSI.

Offline JaroB

  • Guru
  • *****
  • Příspěvků: 971
  • Karma: 27
    • Verze Delphi: XE8, Seattle
Re:Obsah súboru txt - nie je korektný
« Odpověď #14 kdy: 18-06-2019, 20:26:45 »
Třeba by stačilo jen tohle (jde to použít i pro ne-unicode)

Kód: Delphi [Vybrat]
  1. var
  2.   s: {$IFDEF UNICODE}TStringStream{$ELSE}TStringList{$ENDIF};
  3. begin
  4.   {$IFDEF UNICODE}
  5.   s := TStringStream.Create('-- nějaký text --');
  6.   {$ELSE}
  7.   s := TStringList.Create;
  8.   s.Text := '-- nějaký text --';
  9.   {$ENDIF}
  10.   try
  11.     s.SaveToFile(SaveDialog1.FileName);
  12.     if FileExists(SaveDialog1.FileName) then
  13.       MessageDlg('Soubor byl uložen sem'#13#10 + ExtractFilePath(SaveDialog1.FileName), mtInformation, [mbOK], 0);
  14.   finally
  15.     s.Free;
  16.   end;
  17.  
  18.