wie schreibe ich EOF?

Für Fragen zur Programmiersprache auf welcher Lazarus aufbaut
Antworten
stefanhuglfing
Beiträge: 4
Registriert: Mo 4. Jan 2016, 08:30

wie schreibe ich EOF?

Beitrag von stefanhuglfing »

Ich mache gerade erste Schritte mit Dateien und möchte eine Datei lesen.
Dazu habe ich mit einem Editor (Pluma unter UbuntuMate) eine kleine Textdatei
LeseText.txt
erstellt und das Programm unten geschrieben.
Wenn ich das Programm laufen lasse, hört es nicht auf. Es findet anscheinend kein EOF.

Ich dachte ein Texteditor macht von selbst ein EOF ans Ende.
Oder muss ich das selber machen? Wenn ja, wie?

Code: Alles auswählen

 
var
  datDatei: TextFile;
  strName: String;
 
begin
  Assign(datDatei, 'Stefan/FreePascal/LeseText.txt');
  Reset(datDatei);
  while not eof(datDatei) do
    begin
      read(datDatei, strName);
    end;
  Close(datDatei);
end;
 

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2641
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: wie schreibe ich EOF?

Beitrag von m.fuchs »

Du möchtest eine Datei zeilenweise einlesen? Dann verwende ReadLn anstelle von Read.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Mathias
Beiträge: 6207
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: wie schreibe ich EOF?

Beitrag von Mathias »

Du möchtest eine Datei zeilenweise einlesen? Dann verwende ReadLn anstelle von Read.

So wird aber nur die letzte Zeile von "Lesetext.txt* in strName sein.

Wen du die ganze Datei in den String willst, dann würde ich es so machen:

Code: Alles auswählen

var
  fs: TFileStream;
  c: int64;
  s: string;
begin
  c := FileSize(datei);
  SetLength(s, c);
  fs := TFileStream.Create(datei, fmOpenRead);
  if c > 0 then begin
    fs.Read(s[1], c);
  end;
  fs.Free;
  Memo1.Text := s;  // Test
end
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2641
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: wie schreibe ich EOF?

Beitrag von m.fuchs »

Mathias hat geschrieben:
Du möchtest eine Datei zeilenweise einlesen? Dann verwende ReadLn anstelle von Read.

So wird aber nur die letzte Zeile von "Lesetext.txt* in strName sein.

Was ja nichts macht, wenn man jede Zeile innerhalb der While-Schleife verarbeitet. Dazu schrieb der OP ja nix.

Wenn man eine ganze Datei auf einen Rutsch einlesen möchte bietet sich sowieso ein TStringList und deren Methode LoadFromFile an.
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

Mathias
Beiträge: 6207
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: wie schreibe ich EOF?

Beitrag von Mathias »

Wenn man eine ganze Datei auf einen Rutsch einlesen möchte bietet sich sowieso ein TStringList und deren Methode LoadFromFile an.

Ich mach das in der Regal auch so, aber der Auto wollte es in einen String schreiben.

Viele Wege führen nach Rom. :wink:
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: wie schreibe ich EOF?

Beitrag von Socke »

m.fuchs hat geschrieben:Wenn man eine ganze Datei auf einen Rutsch einlesen möchte bietet sich sowieso ein TStringList und deren Methode LoadFromFile an.

Die hat aber Probleme mit größeren Dateien; hier wäre meine Empfehlung: Datei mit TFileStream in einen TStringStream lesen und dessen DataSTring an die Text-Eigenschaft der StringList zuweisen.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Mathias
Beiträge: 6207
Registriert: Do 2. Jan 2014, 17:21
OS, Lazarus, FPC: Linux (die neusten Trunk)
CPU-Target: 64Bit
Wohnort: Schweiz

Re: wie schreibe ich EOF?

Beitrag von Mathias »

Die hat aber Probleme mit größeren Dateien; hier wäre meine Empfehlung:

Somit müsste eine Memo auch Probleme haben, dort wird auch mit TFileStream geladen.

Code: Alles auswählen

Procedure TStrings.LoadFromFile(const FileName: string);
Var
        TheStream : TFileStream;
begin
  TheStream:=TFileStream.Create(FileName,fmOpenRead or fmShareDenyWrite);
  try
    LoadFromStream(TheStream);
  finally
    TheStream.Free;
  end;
end;


TStringStream habe ich mir auch angeguckt, sieht nach einer interessanten Classe aus. Diese kannte ich noch nicht.
Mit Lazarus sehe ich grün
Mit Java und C/C++ sehe ich rot

Antworten