Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Problem mit ifstream

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
12.09.2004, 18:35 Uhr
~Dani
Gast


Dieses Problem hindert uns nun noch daran, unser Projekt fertig zu stellen:

Wir haben eine Textdatei die beim Programmstart ausgelesen und in einem Vector gespeichert werden soll.

Die Textdatei besteht aus Wörtern, die durch eine Raute getrennt werden. Wir lesen also immer von Raute zu Raute.
Der Einlese-Vorgang geschieht in einer while-Schleife.
Das Problem ist nun, dass die while-Schleife trotz der Anweisung while(dh.good()) auch bei einer leeren Textdatei einmal durchlaufen wird. Und wenn in der Textdatei eigentlich soviel drinsteht, dass die Schleife mehrmals durchlaufen werden müsste, wird die while-Schleife auch (nur) einmal durchlaufen... Wir haben schon hin und her probiert, wissen aber nicht woran es liegen könnte... while(!dh.eof()) haben wir auch schon ausprobiert.
Hier mal ein code-ausschnitt:

C++:
vector<Medium*> mainVec;

char test[100000];

vector<Medium*> getMainVec()
{
    return mainVec;
}

void readCdAudio()
{
    // Textdatei cdAudio.txt auslesen
    ifstream dh ("cdAudio.txt");
    if(!dh)
    {
        cerr << "cdAudio.txt konnte nicht geöffnet werden!" << endl;
        exit(-1);
    }
    
    while (dh.good())
    {
        CdAudio *cda = new CdAudio();
        bool isBoot = true;
        bool lent = true;
        bool isSingle = true;
        
        dh.getline(test, 100000, '#');
        string interpret = test;
        cda->CdAudio::setInterpret(interpret);
        
        dh.getline(test, 100000, '#');
        string title = test;
        cda->CdAudio::setTitle(title);
                
        dh.getline(test, 100000, '#');
        string id = test;
        cda->CdAudio::setId(id);
                
        dh.getline(test, 100000, '#');
        string length = atoi(test);
        cda->CdAudio::setLength(length);
                
        dh.getline(test, 100000, '#');
        if (test[0] == '0')
        {
            isBoot = false;
        }
        cda->CdAudio::setIsBoot(isBoot);
        
        dh.getline(test, 100000, '#');
        string genre = test;
        cda->CdAudio::setGenre(genre);
        
        dh.getline(test, 100000, '#');
        string place = test;
        cda->CdAudio::setPlace(place);
            
        dh.getline(test, 100000, '#');
        if (test[0] == '0')
        {
            lent = false;
        }
        cda->CdAudio::setLent(lent);
                
        dh.getline(test, 100000, '#');
        string lentByName = test;
        cda->CdAudio::setLentByName(lentByName);
                
        dh.getline(test, 100000, '#');
        string lentByMail = test;
        cda->CdAudio::setLentByMail(lentByMail);
                
        dh.getline(test, 100000, '#');
        int releaseYear = atoi(test);
        cda->CdAudio::setReleaseYear(releaseYear);
        
        dh.getline(test, 100000, '#');
        string comment = test;
        cda->CdAudio::setComment(comment);
        
        dh.getline(test, 1, '#');
        if (test[0] == '0')
        {
            isSingle = false;
        }
        cda->CdAudio::setIsSingle(isSingle);
        
        cda->CdAudio::setType("Audio-CD");
        
        setMainVec(cda);
    }
    dh.close();
}



Wir wären echt dankbar wenn jemand helfen könnte...
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
12.09.2004, 19:24 Uhr
virtual
Sexiest Bit alive
(Operator)


Also erstmal ists so, daß good() solange true zurück gibt, wie kein Fehler das war. Wenn Deine Datei leer ist, dann ist das erstmal kein Fehler, noch nicht mal eof ist gesetzt. Erst, wenn Du versuchst, das erste nicht mehr vorhandene Zeichen zu lesen, wird eof gesetzt und good() gibt dann wohl auch false zurück. Dies dürfte halbwegs plausibel erklären, warum die schleife also mindestens einmal durchlaufen wird.

Die tatsache, daß es genau einmal durchlaufen läßt, läßt darauf schliessen, daß irgendwo ein Lesevorgang fehlschlug. Wo das genu ist, kann ich dir nicht sagen.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
12.09.2004, 19:59 Uhr
~Dani
Gast


Gibt es denn eine Möglichkeit rauszubekommen, ob die Datei leer ist?

Mit while(!dh.eof()) landen wir übrigens in einer Endlosschleife... Auch sehr seltsam!?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
12.09.2004, 20:27 Uhr
~Dani
Gast


So, Problem gelöst.
Mit while (dh.getline(test, 100000, '#')) geht es!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
12.09.2004, 21:17 Uhr
(un)wissender
Niveauwart


Na, das sieht mir nicht nach gelöst aus, sonder durch krudes Getue verschoben, ev. auf später.
--
Wer früher stirbt ist länger tot.

Dieser Post wurde am 12.09.2004 um 21:17 Uhr von (un)wissender editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
12.09.2004, 21:29 Uhr
~Dani
Gast


hm, nee weiß nicht. Ich denke schon dass es so geht.. Ich wüsste nicht, was da später nicht gehen sollte eigentlich...

HMmmmm
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
12.09.2004, 21:34 Uhr
(un)wissender
Niveauwart


Kannst das so machen, wenn es funzt, klar!
Wenn du aber größere Software schreibst, dann sollte man so was in der Art "Da isn Problem, weiß nicht was es ist, aber wenn ich das hier mache, funzt es irgendwie(durch Zufall), warum weiß ich aber auch nicht" tunlichst vermeiden, weil da extreme Nebeneffekte auftreten können und man sucht und sucht...
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
13.09.2004, 12:45 Uhr
~Dani
Gast


Ja, das ist klar.

Aber wie virtual ja sagte, ist es normal dass die Schleife trotz good() mindestens einmal durchlaufen wird. Und so wird in der while-Schleife halt gesagt, dass eingelesen werden soll. und wo nichts ist, kann auch nichts eingelesen werden.

Und das Problem dass die schleife immer nur einmal durchlaufen wurde lag sicherlich daran:


C++:
        dh.getline(test, 100000, '#'); // da hatte ich versehentlich "1" statt "100000" stehen
        if (test[0] == '0')
        {
            isSingle = false;
        }
        cda->CdAudio::setIsSingle(isSingle);

 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
13.09.2004, 15:05 Uhr
(un)wissender
Niveauwart


Ok, wie auch immer.

Mal was anders:

Warum schreibt du eigentlich immer

C++:
cda->CdAudio::setIsSingle(isSingle);



cda ist ein CdAudioobjekt, oder nicht?
Waru dann nicht einfach

C++:
cda->setIsSingle(isSingle);


--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
13.09.2004, 19:02 Uhr
~Dani
Gast


Hm, das ist ne gute Frage...

Ich bin der Meinung, dass der compiler irgendwann mal gemeckert hat, als es nicht da stand...
ich kann mich aber auch täuschen.
Danke für den Hinweis!

Kann das denn irgendwelche Fehler bergen oder wär es einfach nur schöner und weniger Schreibarbeit`?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: