Lesen aus einer Textdatei verursacht einen Fehler
-
hi,
bei meinem Problem geht es um folgenden Programmteil:while(!fin.eof()) { fin.getline(mapline,65,'\n'); if (!fin.good()) { ... } else { ... } }
ich möchte mit der Funktion getline zeilenweise aus einer Textdatei lesen. Danach prüfe ich mit der if-Anweisung ob beim Lesen der Datei ein Fehler aufgetreten ist, wenn das der Fall ist wird eine Fehlermeldung ausgegeben. Das Problem ist, dass es in der Textdatei eine Zeile gibt die mit /* anfängt und mit */. Wird diese Zeile eingelesen ist fin.good() nicht mehr true und das Lesen wird abgebrochen. Ich verstehe im Moment jedoch nicht warum das passiert.Kann mir jemand erklären wo mein Denkfehler liegt?
-
Ist die Zeile länger als 64 Zeichen?
Oder ist es die letzte Zeile in der Datei?
-
Was steht denn bei dir im else-Teil? Wenn da nur break (oder vergleichbarer Abbruchcode oder auch einfach gar nichts) steht, kannst du das auch viel einfacher haben, mittels
while(fin.getline(mapline,65,'\n')) { ... }
Gibt es einen Grund, keinen String zu benutzen?
P.S.: Das '\n' kannst du dir auch sparen, das ist der Standardwert, wenn man nichts angibt.
-
die längste zeile ist 64 zeichen lang. die zeile um die ist geht ist folgende:
/************ CityMap ************/
die datei fängt mit einer leerzeile an und ich weiß nicht ob das wirklich das problem ist.
-
im else teil gucke ich ob das erste zeichen der zeile ( mapline[0]) eine # ist. trifft das zu wird die zeile einer anderen Funktion übergeben. das /n hab ich einfach drinne gelassen weil ich mit einfach ein bisschen verständlicher fand.
-
sanJo18 schrieb:
im else teil gucke ich ob das erste zeichen der zeile ( mapline[0]) eine # ist.
Das ist wirr. Du hast doch gerade davor festgestellt, dass das Lesen fehlgeschlagen ist. Und dann verarbeitest du trotzdem irgendwelchen Müll. Da stimmt etwas hinten und vorne nicht an deiner Programmlogik. Zeig mal ein vollständiges, minimales Beispiel mit dazugehöriger Datendatei, so dass man den Fehler nachvollziehen kann. Siehe dritter Link in meiner Signatur.
-
ok dann versuch ich jetzt gerade mal ein Beispiel zusammenstellen und poste es dann. was ich mir eigentlich gedacht hatte war:
1.) zeile mit getline einlesen
2.) wenn fin.good() nach dem Einlesen nicht mehr zutrifft eine Fehlermeldung ausgeben
3.) wenn alles ok ist und # das erste Zeichen der Zeile ist wird sie weiterverarbeitetEs sollte daher nicht dazu kommen, dass irgendein Müll verarbeitet wird.Aber ich versuch das Problem nochmal darzustellen.
-
sanJo18 schrieb:
bei meinem Problem geht es um folgenden Programmteil:
while(!fin.eof())
.. und wieder ein Opfer des While-not-EOF-Virus' und heute war schon einer da
auch wenn die Auswirkungen durch das folgende if(!good()) etwas abgemildert werden.
Die letzte Zeile der Datei wird so nicht gelesen, wenn kein EOL(0x10 alias '\n') am Ende folgt.Was steht in der Datei und was willst Du lesen - also in Deinem Programm benutzen?
-
sanJo18 schrieb:
2.) wenn fin.good() nach dem Einlesen nicht mehr zutrifft eine Fehlermeldung ausgeben
.. besser:
2.) wenn!fin.fail()
nach dem Einlesen nicht mehr zutrifft eine Fehlermeldung ausgeben und Einlesen beenden
oder alternativ:
2.) wennfin.fail()
nach dem Einlesen zutrifft eine Fehlermeldung ausgeben und Einlesen beenden
-
sanJo18 schrieb:
3.) wenn alles ok ist und # das erste Zeichen der Zeile ist wird sie weiterverarbeitet
wie sieht den die 'Weiterverarbeitung' aus?
Falls Du danach anfängst, den String zu parsen, so ist das vorherige getline keine gute Idee - siehe auch hier.
-
@Werner_logoff: du hast recht liegt wirklich an der letzten Zeile. bin gerade selber drauf gekommen als ich das Beispielprogramm zusammenstellen wollte. Ich soll der Textdatei eine Karte lesen auf der dann "Autos" fahren sollen.
Als beim ersten Durchlauf meines Programms nur die Fehlermeldung ausgegeben wurde und davor keine Zeile aus der Textdatei, bin ich davon ausgegangen, dass der Fehler am Anfang liegt und nicht am Ende. War ein Denkfehler meinerseits.