Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Daten beim einlesen verschluckt, warum? (https://www.delphipraxis.net/49156-daten-beim-einlesen-verschluckt-warum.html)

Masterof 6. Jul 2005 11:04


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:
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;
MfG Master

marabu 6. Jul 2005 11:13

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:
var
  frmmain: Tfrmmain;

implementation

{$R *.dfm}

procedure Tfrmmain.FormCreate(Sender: TObject);
begin
  with opendialog do
    if Execute then
      memDatem.Lines.LoadFromFile(FileName);
end;
Grüße vom marabu

BrunoT 6. Jul 2005 11:14

Re: Daten beim einlesen verschluckt
 
Hi MasterOf,

Delphi-Quellcode:
  try
   while not eof(myfile) do
   begin
    ReadLn(myfile,data);
    memdaten.Lines.Add(data.daten);
Du schreibst, dass die Zeilenlänge schwankt, daher würde ich ReadLn nehmen, da dann beim Zeilenende das Lesen aufhöhrt.
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:

Masterof 6. Jul 2005 11:20

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

BrunoT 6. Jul 2005 11:28

Re: Daten beim einlesen verschluckt
 
Hi MasterOf,

wo tritt der Fehler auf?

imho sollte es auf jeden fall so gehen:

Delphi-Quellcode:
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;
mfg

BrunoT

BrunoT 6. Jul 2005 11:31

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

Masterof 6. Jul 2005 11:35

Re: Daten beim einlesen verschluckt, warum?
 
Hallo!

ok, ich wollte gerade sagen, das es ein Textfile sein muss. Sonst funktioniert es.
Danke
MfG Master

shmia 6. Jul 2005 12:56

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:
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;
Die Funktion LoadStringFromFile sollte man immer parat haben. Ebenso wie das Gegenstück:
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;

BrunoT 6. Jul 2005 13:13

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

Masterof 6. Jul 2005 13:28

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:43 Uhr.
Seite 1 von 2  1 2      

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