![]() |
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:
In der Datei steht der Text "test", aber als Ausgabe erhalte ich:
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; --------------------------- Project1 --------------------------- 整瑳be --------------------------- OK --------------------------- Wenn ich "s" dagegen als ansistring deklariere, erhalte ich die korrekte Ausgabe. |
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); |
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:
oder
setlength(s, size div 2);
readbuffer(s[1], size and -2); showmessage(s);
Delphi-Quellcode:
aber besser ... denn irgendwann in ferner Zukunft wird Unicode 4 Byte und dann stimmt die 2 nicht mehr
setlength(s, size div 2);
readbuffer(s[1], Length(s) * 2); showmessage(s);
Delphi-Quellcode:
oder
setlength(s, size div SizeOf(Char));
readbuffer(s[1], size and -SizeOf(Char)); showmessage(s);
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. |
Re: FileStream: Falsche Ausgabe unter D2010
Zitat:
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; |
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? |
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); |
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? |
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 |
Re: FileStream: Falsche Ausgabe unter D2010
OK, Danke, das lass ich dann doch lieber sein :wink:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:17 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz