Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi FileStream: Falsche Ausgabe unter D2010 (https://www.delphipraxis.net/143629-filestream-falsche-ausgabe-unter-d2010.html)

luke2 19. Nov 2009 21:30


FileStream: Falsche Ausgabe unter D2010
 
Hallo,

Kann mir jemand sagen, wieso es unter D2010 (also mit Standard-Unicodestrings) 1. ewig dauert, bis man mit folgendem Code eine 3KB Datei eingelesen hat und 2. wieso dabei nur Quark rauskommt?

Testcode:
Delphi-Quellcode:
var s:string;
begin
with tfilestream.Create('c:\test.txt',fmopenread) do try
  setlength(s,size);
  readbuffer(s[1],size);
  showmessage(s);
finally
  free;
end;
In der Datei steht der Text "test", aber als Ausgabe erhalte ich:
---------------------------
Project1
---------------------------
整瑳be
---------------------------
OK
---------------------------
Wenn ich "s" dagegen als ansistring deklariere, erhalte ich die korrekte Ausgabe.

Uwe Raabe 19. Nov 2009 22:00

Re: FileStream: Falsche Ausgabe unter D2010
 
Weil Unicode-Chars 2 Byte groß sind, TStream.Size aber Bytes angibt.

Delphi-Quellcode:
 
setlength(s,size div 2);
readbuffer(s[1],size div 2);

himitsu 19. Nov 2009 22:02

Re: FileStream: Falsche Ausgabe unter D2010
 
Was für Text ist in der Datei?

Unicode ist 2 Byte pro Zeichen, also sind in der Datei auch nur halbsoviele Dateien.

Delphi-Quellcode:
setlength(s, size div 2);
readbuffer(s[1], size and -2);
showmessage(s);
oder
Delphi-Quellcode:
setlength(s, size div 2);
readbuffer(s[1], Length(s) * 2);
showmessage(s);
aber besser ... denn irgendwann in ferner Zukunft wird Unicode 4 Byte und dann stimmt die 2 nicht mehr
Delphi-Quellcode:
setlength(s, size div SizeOf(Char));
readbuffer(s[1], size and -SizeOf(Char));
showmessage(s);
oder
Delphi-Quellcode:
setlength(s, size div SizeOf(Char));
readbuffer(s[1], Length(s) * SizeOf(Char));
showmessage(s);


Und was so ewig dauert ... k.A., aber die Stringbehandlung ist seit D2009 eh voll schrottig.
Definier {$STRINGCHECKS OFF} und versuch es nochmal ... vielleicht bringt es was.

Neutral General 19. Nov 2009 22:02

Re: FileStream: Falsche Ausgabe unter D2010
 
Zitat:

Zitat von Uwe Raabe
Weil Unicode-Chars 2 Byte groß sind, TStream.Size aber Bytes angibt.

Delphi-Quellcode:
 
setlength(s,size div 2);
readbuffer(s[1],size div 2);

Gelesen werden müssen trotzdem noch alle Bytes :wink:

Bzw wenn es ne ASCII/ANSI Datei ist würde ich folgendes empfehlen:

Delphi-Quellcode:
var s: AnsiString;
begin
  with TFilestream.Create('c:\test.txt',fmOpenRead) do
    try
      SetLength(s,Size);
      ReadBuffer(s[1],Size);
      ShowMessage(s); // Um die Warnung wegzubekommen: ShowMessage(String(s))
    finally
      free;
    end;
end;

luke2 19. Nov 2009 22:23

Re: FileStream: Falsche Ausgabe unter D2010
 
Danke für die Antworten.
Ich habe alle vorgeschlagenen Lösungen ausprobiert, aber ich erhalte leider immer noch diese komischen Zeichen als Ausgabe.

@himitsu
Es ist eine ganz normale Ansi-Textdatei.

@Neutral General
Das hatte ich schon probiert. Es funktioniert, aber ich würde es gerne in einen Unicodestring einlesen, auch wenn es eine Ansidatei ist.

Hat noch jemand eine Idee?

himitsu 19. Nov 2009 22:28

Re: FileStream: Falsche Ausgabe unter D2010
 
OK, wenn es Ansi ist, dann muß es auch erstmal in einen AnsiString rein :stupid:
Delphi-Quellcode:
var a: AnsiString;
  s: String;

SetLength(a, Size);
ReadBuffer(a[1], Size);
s := a;

ShowMessage(s);

luke2 19. Nov 2009 22:31

Re: FileStream: Falsche Ausgabe unter D2010
 
In meinem Test war es eine Ansidatei, aber das muss es nicht immer sein.

Gibt es eine allgemeine Lösung, so dass es mit allen Formaten funktioniert oder gibt es eine Möglichkeit das Format vorher zu erkennen und dann entsprechend zu reagieren?

himitsu 19. Nov 2009 22:45

Re: FileStream: Falsche Ausgabe unter D2010
 
Dann mußt du das BOM auswerten und abhängig davon den Dateiinhalt SELBER nach Unicode umkodieren.

oder TStringList

luke2 19. Nov 2009 22:48

Re: FileStream: Falsche Ausgabe unter D2010
 
OK, Danke, das lass ich dann doch lieber sein :wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz