istream::tellg bricht Schleife ab
-
Okay, bad und eof sind nicht gesetzt, aber fail ist gesetzt. Ich würde vermuten, dass in der Datei etwas zu lesen ansteht, das nicht zu dem Datentyp passt, in den Du einlesen willst. Also möglicherweise ist die Variable tag vom Typ int, in der Datei folgt aber keine Ziffer, irgendsoetwas muss es sein.
-
Wenn datei.tellg() nicht verwendet wird, funktioniert ja alles und wir richtig eingelesen und auch ausgegeben.
Ich sehe gerade, dass da einiges komisch läuft:
datei.tellg() z.B. in der ersten Zeile, die eingelesen und ausgegeben wird nimmt den Wert datei.tellg()+1 an, wenn eine weitere Zeile in die Datei geschrieben wurde und diese dann eingelesen und ausgegeben wird. Füge ich noch weiter Zeilen hinzu, so wird datei.tellg() an dieser Stelle immer um 1 erhöht.
Dann passiert noch was komisches: Wenn 2 Zeilen in der Datei sind, wird die 1. korrekt ausgegeben. Die 2. nicht.
Schreibe ich weitere Zeilen in die Datei, so werden nur die 1. und die letzte Zeile richtig eingelesen und ausgegeben (die Zeilen dazwischen nicht).Wenn diffmin in einer Zeile negativ ist, so wird diese zwar wie vorher ausgegeben (als letzte Zeile), allerdings läuft der ganze Loop nur noch ein mal, wenn ich dann (nach dem negativen diffmin) noch eine weitere Zeile anhänge (mit positivem diffmin).

-
Das klingt alles sehr komisch. Ich schlage vor, Du kürzt Dein Programm auf ein paar Zeilen (max 100) so, dass es vollständig kompilierbar ist, und das Problem noch aufweist. Dann postest Du dieses Programm hier, und zusätzlich die ersten paar Zeilen Deiner Eingabedatei.
Vielleicht findet sich dann jemand, der das selbst mal ausprobiert und helfen kann.
-
js707 schrieb:
Dann passiert noch was komisches: Wenn 2 Zeilen in der Datei sind, wird die 1. korrekt ausgegeben. Die 2. nicht.
Schreibe ich weitere Zeilen in die Datei, so werden nur die 1. und die letzte Zeile richtig eingelesen und ausgegeben (die Zeilen dazwischen nicht).Moment! Heißt das, du hast die Datei zum gleichzeitigen Lesen und schreiben geöffnet und schreibst gleichzeitig noch? Meinst du nicht, dass das relevant für deine Frage gewesen wäre?
-
@SeppJ: Mit dem Schreiben meine ich Verändern der Datei von Hand per Editor.
-
Ich habe den Programmteil mal isoliert zu einem lauffähigen Programm.
Im Ordner der ausführbaren Datei soll die Datei "liste" sein.
#include <iostream> #include <fstream> #include <cstdlib> #include <sstream> #include <windows.h> using namespace std; int main(){ int id = 1; long pos; int auswahl_jahr = 2012; int auswahl_monat = 1; int tag; int jahr; int monat; string uhrzeit1, uhrzeit2; int pause; float soll; int diffmin; system("cls"); cout << "ID\tTag\tBeginn\tEnde\tPause\tSoll\tUberstunden" << endl << endl; ifstream datei("liste"); pos = datei.tellg(); while(datei >> tag >> monat >> jahr >> uhrzeit1 >> uhrzeit2 >> pause >> soll >> diffmin){ if(monat==auswahl_monat && jahr==auswahl_jahr){ cout << id << "\t" << tag << "\t" << uhrzeit1 << "\t" << uhrzeit2 << "\t" << pause << "\t" << soll << "\t" << diffmin << endl; } cout << "VOR tellg:\tID = " <<id << " datei.eof()=" << datei.eof() << " datei.bad()=" << datei.bad() <<" datei.fail()=" << datei.fail() << " pos = " << pos << endl; pos = datei.tellg(); // Ohne diese Zeile funktioniert alles. cout << "NACH tellg:\tID = " <<id << " datei.eof()=" << datei.eof() << " datei.bad()=" << datei.bad() <<" datei.fail()=" << datei.fail() << " pos = " << pos << endl << endl; } return 0; }Die Datei "liste" sieht so aus:
1 1 2012 09:00 19:00 10 3 410 2 1 2012 19:00 23:00 10 1 170 3 1 2012 09:00 19:00 10 3 410 4 1 2012 09:00 10:00 10 2 -70 5 1 2012 09:00 19:00 10 1 530(Allerdings mit Absatz nach der letzten Zeile.)
Es wäre echt schön, wenn sich das mal jemand genauer anschauen könnte.
-
Bist du dir sicher das der Fehler mit dem Code auch auftritt?
Bei mir (Win7, VS2010 Express) werden alle fünf Zeilen korrekt ausgegeben und der Stream hat auch keine Fehlerzustände.
Gruß
stalker
-
Funktioniert mit und ohne Zeile 31. Im zweiten Fall bleibt natürlich 'pos' immer 0, aber es wird vorher alles genauso gelesen.
Umgebung: Windows XP, Visual Studio 2010Gruß
Werner
-
Wtf?!

Ich habe CodeBlocks, Windows 7.
Visual Studio wollte ich mir mal zulegen, konnte es aber wegen eines Fehlers nie starten.
Hm.. was schlagt ihr mir vor zu tun?
Edit: Ich habe jetzt mal den Dateiinhalt aus dem Forum kopiert und eingefügt.
Dann wird alles ausgegeben außer die Zeile mit tag==2.
Füge ich am ende des Dateiinhaltes noch den Absatz ein, den ich erwähnt habe und den mein Programm auch immer mit einfügt, so werden die Zeilen mit tag==2 und tag==3 nicht ausgegeben.
-
js707 schrieb:
Wtf?!

Ich habe CodeBlocks, Windows 7.
Visual Studio wollte ich mir mal zulegen, konnte es aber wegen eines Fehlers nie starten.
Hm.. was schlagt ihr mir vor zu tun?
Edit: Ich habe jetzt mal den Dateiinhalt aus dem Forum kopiert und eingefügt.
Dann wird alles ausgegeben außer die Zeile mit tag==2.
Füge ich am ende des Dateiinhaltes noch den Absatz ein, den ich erwähnt habe und den mein Programm auch immer mit einfügt, so werden die Zeilen mit tag==2 und tag==3 nicht ausgegeben.
Läuft wirklich exakt das Programm, welches du uns hier gezeigt hast mit exakt der Datei, die du uns gezeigt hast bei dir nicht? Oder verwendest du ein ähnliches Programm, bei dem du ein paar Sachen weg gelassen hast, bevor du es hier ins Forum gestellt hast?
-
Identisches Programm. Identischer Dateiinhalt.
CPU falsch zusammengelötet?

-
Liegt die Datei auf irgendeinem komischen Datenträger? Netzwerkstream oder ähnliches?
-
Liegt auf meiner HDD.
-
Nach langer Zeit habe ich mich noch ein mal drangesetzt und die Ursache des Problems gefunden:
Die (ursprüngliche) Datei, aus der gelesen wurde, enthielt Einrückungen ("\t") und Absätze (endl).
Damit kommt tellg() nicht zurecht und verschiebt beim Feststellen der Cursorposition den Cursor selbst, sodass ganze Strings beim Einlesen übersprungen werden.In der Datei dürfen die Strings nur durch Leerzeichen getrennt werden. Keine Formatierung.
Schöne Grüße
Julius