AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

FileStream: Falsche Ausgabe unter D2010

Ein Thema von luke2 · begonnen am 19. Nov 2009 · letzter Beitrag vom 19. Nov 2009
Antwort Antwort
luke2

Registriert seit: 17. Jun 2009
117 Beiträge
 
#1

FileStream: Falsche Ausgabe unter D2010

  Alt 19. Nov 2009, 22:30
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.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#2

Re: FileStream: Falsche Ausgabe unter D2010

  Alt 19. Nov 2009, 23:00
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);
Uwe Raabe
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#3

Re: FileStream: Falsche Ausgabe unter D2010

  Alt 19. Nov 2009, 23:02
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.
$2B or not $2B
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

Re: FileStream: Falsche Ausgabe unter D2010

  Alt 19. Nov 2009, 23:02
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

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;
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
luke2

Registriert seit: 17. Jun 2009
117 Beiträge
 
#5

Re: FileStream: Falsche Ausgabe unter D2010

  Alt 19. Nov 2009, 23:23
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#6

Re: FileStream: Falsche Ausgabe unter D2010

  Alt 19. Nov 2009, 23:28
OK, wenn es Ansi ist, dann muß es auch erstmal in einen AnsiString rein
Delphi-Quellcode:
var a: AnsiString;
  s: String;

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

ShowMessage(s);
$2B or not $2B
  Mit Zitat antworten Zitat
luke2

Registriert seit: 17. Jun 2009
117 Beiträge
 
#7

Re: FileStream: Falsche Ausgabe unter D2010

  Alt 19. Nov 2009, 23:31
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?
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#8

Re: FileStream: Falsche Ausgabe unter D2010

  Alt 19. Nov 2009, 23:45
Dann mußt du das BOM auswerten und abhängig davon den Dateiinhalt SELBER nach Unicode umkodieren.

oder TStringList
$2B or not $2B
  Mit Zitat antworten Zitat
luke2

Registriert seit: 17. Jun 2009
117 Beiträge
 
#9

Re: FileStream: Falsche Ausgabe unter D2010

  Alt 19. Nov 2009, 23:48
OK, Danke, das lass ich dann doch lieber sein
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:23 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