Autor Beitrag
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Do 20.09.07 21:37 
Guten Abend liebe DF-Gemeinde,

ich erzeuge in der Konsole eine Textdatei, fülle diese mit den Zahlen 1 bis n, in diesem Falle bis n = 100.
Anschließend "wandere" ich mit Hilfe einer While-Schleife und EOF zum letzten Element und lasse es mir ausgeben.
Allerdings steht nun dort 101 anstelle von 100. Der Wert wurde also um eins erhöht.
Doch wie kann das sein? Es wurde doch niemals der Wert 101 in die Datei geschrieben!?

Wäre schön, wenn jemand eine Antwort parat hätte.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
var
 f: file of integer;
 i: integer;
begin
   rewrite(f,extractfilepath(paramstr(0))+'foo.txt');
   reset(f);

  for i := 1 to 100 do
     write(f,i);

  while not eof(f) do
     read(f,i);
  
  closefile(f);
  writeln(i);

readln;
end.


grüße


Zuletzt bearbeitet von Marc. am Fr 21.09.07 13:43, insgesamt 1-mal bearbeitet
Saarpoint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 199

Win XP Home, Vista Home Premium
D5 Std, D7 pers., D2005 Pro. SP3, TurboDelphi
BeitragVerfasst: Do 20.09.07 21:59 
Bin mir jetzt nicht ganz sicher, aber eigentlich wurde doch ein 101stes Zeichen geschrieben.
Und zwar das EOF-Zeichen selbst. Damit das File-System, bzw. die EOF-Abfrage ein true zurückliefern kann.

Gruß, Andreas

_________________
Standart := false; Standard := true;
Saarpoint
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 199

Win XP Home, Vista Home Premium
D5 Std, D7 pers., D2005 Pro. SP3, TurboDelphi
BeitragVerfasst: Do 20.09.07 22:07 
Das EOF-Zeichen selbst ist unsichtbar, daher siehst du selbst nur 100 Zeichen.
Ich denke, dass Problem löst sich dadurch, dass du zwischen lesen und schreiben der Datei ein CloseFile dazwischen setzt.
So wie es vom jetzigen Quelltext aussieht, wird immer nur das 101ste Zeichen gelesen, da nach dem 100sten Zeichen (also wenn die Schleife zu Ende ist) direkt ein EOF-Zeichen folgt. Und genau dieses wird als 101stes Zeichen erkannt.
Wenn Du Datei schließt und dann erneut öffnest, fängt das Einlesen von vorne (also ab Zeichen 1) an und liefert letztendlich auch das richtige Ergebnis.

_________________
Standart := false; Standard := true;
uko
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 220
Erhaltene Danke: 1

Win XP, VISTA, WIndows 7
Delphi 2007/2010 Prof
BeitragVerfasst: Fr 21.09.07 07:53 
Hi,

deine Problem liegt im Code nach dem Schreiben der Integer:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
  for i := 1 to 100 do
     write(f,i);

  // jetzt steht i auf 101 (genauer: ist undefiniert)

  // diese Schleife wird nun nie durchlaufen, da eof schon erreicht ist. 
  // Du mußt die Datei erst mal mit Reset zurücksetzen oder Schliessen und neu aufmachen
 
  while not eof(f) do
     read(f,i);

  closefile(f);

  // gibt bei Dir den Stand nach der For-Schleife aus! 
  writeln(i);


grüße,
Uli
Marc. Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Fr 21.09.07 13:26 
Alles klar, das wäre dann geklärt. Vielen Dank für eure Antworten. :)

edit: Eine weitere Möglichkeit neben dem Öffnen und wieder Schließen wäre mit Hilfe von Seek(); den Zeiger an den Anfang zu setzen, bevor man mit EOF() arbeitet.

grüße,

Marc.