![]() |
Daten beim einlesen verschluckt, warum?
Hallo!
Ich habe ein Problem, ich lese Daten aus einer Textdatei in ein Record. Die Zeilenlänge in der Textdatei ist max 241 Zeichen. Wenn ich die Datei einlesen und den Inhalt des Records anzeigen lasse, fehlen an verschiedenen Stellen Daten. Ich habe den Quelltext mit dem ich lese und ausgeben unten dazugefügt. Wo könnte der Datenverlust passieren, warum und wie umgeht man das ganze. Quelltext:
Delphi-Quellcode:
MfG Master
Type
TDaten = Record Daten: string[255]; end; var frmmain: Tfrmmain; implementation {$R *.dfm} procedure Tfrmmain.FormCreate(Sender: TObject); var myfile : File of TDaten; czle : string; i, zeiger: integer; data: Tdaten; begin if opendialog.Execute then begin i:=0; assignfile(myfile, opendialog.FileName); reset(myfile); try while not eof(myfile) do begin read(myfile,data); memdaten.Lines.Add(data.daten); end; |
Re: Daten beim einlesen verschluckt
Es ist nicht ganz ersichtlich, warum du eine typisierte Datei und einen record verwendest um eine Textdatei zu verarbeiten. Wenn du die Datei auch erzeugst, dann schreibe doch einfach Textzeilen rein und lese sie so wieder ein:
Delphi-Quellcode:
Grüße vom marabu
var
frmmain: Tfrmmain; implementation {$R *.dfm} procedure Tfrmmain.FormCreate(Sender: TObject); begin with opendialog do if Execute then memDatem.Lines.LoadFromFile(FileName); end; |
Re: Daten beim einlesen verschluckt
Hi MasterOf,
Delphi-Quellcode:
Du schreibst, dass die Zeilenlänge schwankt, daher würde ich ReadLn nehmen, da dann beim Zeilenende das Lesen aufhöhrt.
try
while not eof(myfile) do begin ReadLn(myfile,data); memdaten.Lines.Add(data.daten); Read liest IMMER die volle Zeichenzahl(255), also nimmt es auch alle Zeilenumbrüche mit #13#10. mfg BrunoT @marabu: eventuell will er ja nicht alle Zeilen in das memo übernehmen, sondern nur jede 3.Zeile? :wink: |
Re: Daten beim einlesen verschluckt
Hallo!
Das Memo habe ich nur zur Kontrolle,das hatte ich vergessen zu erwähnen. Der String wird hinterher in viele Teile zerlegt und umgestellt und zwar Zeile für Zeile. Leider kann man die Daten nicht mit readln lesen und sie in einen Record schreiben, da kommt ein Fehler. Also wie gesagt, ich brache jede Zeile enzeln um in ihr einen bestimmten Wert zu suchen. MfG Master |
Re: Daten beim einlesen verschluckt
Hi MasterOf,
wo tritt der Fehler auf? imho sollte es auf jeden fall so gehen:
Delphi-Quellcode:
mfg
Type
TDaten = Record Daten: string[255]; end; var frmmain: Tfrmmain; implementation {$R *.dfm} procedure Tfrmmain.FormCreate(Sender: TObject); var myfile :Textfile; //Textdatei Zeile : string[255]; //zum Einlesen i, zeiger: integer; data: Tdaten; begin if opendialog.Execute then begin i:=0; assignfile(myfile, opendialog.FileName); reset(myfile); try while not eof(myfile) do begin ReadLn(myfile,zeile); data.daten:=zeile; // sollten doch wohl zuweisungskompatibel sein memdaten.Lines.Add(data.daten); end; BrunoT |
Re: Daten beim einlesen verschluckt, warum?
Oops,
es muss matürlich eine TextFile sein. Du kannst keine Typisierte Datei mit Zeilenlänge 255 nehmen, um eine Textdatei mit unterschiedlicher Länge zu lesen. mfg BrunoT |
Re: Daten beim einlesen verschluckt, warum?
Hallo!
ok, ich wollte gerade sagen, das es ein Textfile sein muss. Sonst funktioniert es. Danke MfG Master |
Re: Daten beim einlesen verschluckt, warum?
Also ich würde den ganzen alten Kruscht mit assignfile, readln, ... wegschmeisen und stattdessen
mit den "modernen" Streams arbeiten. Der Datentyp file of [Typ] verwendet gepufferte Schreib- und Lesezugriffe. In der heutigen Zeit, da das Betriebssystem Dateien puffert, ist das eher störend. Du kannst die gesammte Datei auf einen Rutsch auf einen String einlesen. Damit stehen dann sämtliche Möglichkeiten offen.
Delphi-Quellcode:
Die Funktion LoadStringFromFile sollte man immer parat haben. Ebenso wie das Gegenstück:
function LoadStringFromFile(const filename:string):string;
var fs : TStream; begin fs := TFileStream.Create(filename, fmOpenRead or fmShareDenyWrite); try SetLength(Result, fs.Size); fs.ReadBuffer(Result[1], fs.Size); finally fs.Free; end; end; .... var daten : string; begin daten := LoadStringFromFile(opendialog.FileName); memdaten.Lines.Text := daten;
Delphi-Quellcode:
procedure SaveStringToFile(const filename, data:string);
var fs : TStream; begin fs := TFileStream.Create(filename, fmOpenWrite or fmShareDenyWrite); try fs.WriteBuffer(data[1], Length(data)); finally fs.Free; end; end; |
Re: Daten beim einlesen verschluckt, warum?
@shmia,
wieviel Hauptspeicher setzt deine Varante voraus und welche Grenzen hat das Ganze? :gruebel: Es gibt auch noch PIII - Rechner mit 64MB und Win98. :mrgreen: (ganz zu schweigen von P1 mit 16MB und Win95) mfg BrunoT |
Re: Daten beim einlesen verschluckt, warum?
Hallo!
danke nochmal, aber die Variante kenne ich nicht, ich werde es mal probieren. Ich habe das Problem aber mitlerweile gelöst und baue es in diesem Projekt nicht nochmal um. MfG Master |
Re: Daten beim einlesen verschluckt, warum?
Zitat:
Dieser ist überlicherweise 2 bis 10 mal so gross wie der physikalische Speicher. Bei 2 GB ist garantiert Ende, da ein AnsiString nicht mehr Daten aufnehmen kann. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:49 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