istream::tellg bricht Schleife ab



  • @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 2010

    Gruß
    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.


  • Mod

    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? 😃


  • Mod

    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


Anmelden zum Antworten