AGB  ·  Datenschutz  ·  Impressum  







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

Daten beim einlesen verschluckt, warum?

Offene Frage von "Masterof"
Ein Thema von Masterof · begonnen am 6. Jul 2005 · letzter Beitrag vom 6. Jul 2005
Antwort Antwort
Seite 1 von 2  1 2      
Masterof

Registriert seit: 12. Feb 2004
Ort: Bad Elster
142 Beiträge
 
Delphi 7 Enterprise
 
#1

Daten beim einlesen verschluckt, warum?

  Alt 6. Jul 2005, 11:04
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
.: Meine Homepage :.
http://www.micha-hertel.de
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Daten beim einlesen verschluckt

  Alt 6. Jul 2005, 11:13
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
  Mit Zitat antworten Zitat
Benutzerbild von BrunoT
BrunoT

Registriert seit: 23. Jan 2003
Ort: Sandbeiendorf
360 Beiträge
 
Delphi 8 Professional
 
#3

Re: Daten beim einlesen verschluckt

  Alt 6. Jul 2005, 11:14
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?
Holger

EDV- Ende der Vernunft
Meine Calcedit-Kompo
  Mit Zitat antworten Zitat
Masterof

Registriert seit: 12. Feb 2004
Ort: Bad Elster
142 Beiträge
 
Delphi 7 Enterprise
 
#4

Re: Daten beim einlesen verschluckt

  Alt 6. Jul 2005, 11:20
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
.: Meine Homepage :.
http://www.micha-hertel.de
  Mit Zitat antworten Zitat
Benutzerbild von BrunoT
BrunoT

Registriert seit: 23. Jan 2003
Ort: Sandbeiendorf
360 Beiträge
 
Delphi 8 Professional
 
#5

Re: Daten beim einlesen verschluckt

  Alt 6. Jul 2005, 11:28
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
Holger

EDV- Ende der Vernunft
Meine Calcedit-Kompo
  Mit Zitat antworten Zitat
Benutzerbild von BrunoT
BrunoT

Registriert seit: 23. Jan 2003
Ort: Sandbeiendorf
360 Beiträge
 
Delphi 8 Professional
 
#6

Re: Daten beim einlesen verschluckt, warum?

  Alt 6. Jul 2005, 11:31
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
Holger

EDV- Ende der Vernunft
Meine Calcedit-Kompo
  Mit Zitat antworten Zitat
Masterof

Registriert seit: 12. Feb 2004
Ort: Bad Elster
142 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Daten beim einlesen verschluckt, warum?

  Alt 6. Jul 2005, 11:35
Hallo!

ok, ich wollte gerade sagen, das es ein Textfile sein muss. Sonst funktioniert es.
Danke
MfG Master
.: Meine Homepage :.
http://www.micha-hertel.de
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#8

Re: Daten beim einlesen verschluckt, warum?

  Alt 6. Jul 2005, 12:56
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;
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von BrunoT
BrunoT

Registriert seit: 23. Jan 2003
Ort: Sandbeiendorf
360 Beiträge
 
Delphi 8 Professional
 
#9

Re: Daten beim einlesen verschluckt, warum?

  Alt 6. Jul 2005, 13:13
@shmia,

wieviel Hauptspeicher setzt deine Varante voraus und welche Grenzen hat das Ganze?

Es gibt auch noch PIII - Rechner mit 64MB und Win98.
(ganz zu schweigen von P1 mit 16MB und Win95)

mfg

BrunoT
Holger

EDV- Ende der Vernunft
Meine Calcedit-Kompo
  Mit Zitat antworten Zitat
Masterof

Registriert seit: 12. Feb 2004
Ort: Bad Elster
142 Beiträge
 
Delphi 7 Enterprise
 
#10

Re: Daten beim einlesen verschluckt, warum?

  Alt 6. Jul 2005, 13:28
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
.: Meine Homepage :.
http://www.micha-hertel.de
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 02:03 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