zurücksetzten von ifstream



  • Hallo,
    ich will in meinem Programm aus einer datenbank lesen.
    Mit rand() lasse ich mir eine "Stelle" in der datenbank vorgeben. Dann gehe ich solange durch die Database, bis ich an der Stelle bin und gebe diese aus

    string wert;
    ifstream lesen;
    lesen.open(dateiname.c_str(), ios_base::in);
    for(int a=0;a<anzahlDerDatenInDerDatei;++a)
    {
      lesen>>wert;
    }
    lesen.close();
    cout<<"Der zufällig ausgewählte wert ist "<<wert;
    

    Jetzt möchte ich mehrmals einen zufallswert aus der datenbank auswählen (im beispiel 30 mal)

    string wert;
    ifstream lesen;
    lesen.open(dateiname.c_str(), ios_base::in);
    if(int b=0;b<30;++b)
    {
       for(int a=1;a<=zufaelligGeweahlterWert;++a)
       {
         lesen>>wert;
       }
    cout<<"Der zufällig ausgewählte wert ist "<<wert;
    }
    lesen.close();
    

    Das Problem hierbei ist, dass das Programm von der letzten gelesenen Stelle weiter macht.
    Wenn jetzt zufällig die Position 6 ausgewählt wird, wir mir auch der 6. Wert der Datei ausgegeben. Wenn die nächste Zufallszahl 4 ist, wird mir nicht der 4., sondern der 10. Wert ausgegeben.

    Weis jemand wie man dieses lesen>>wert auf die startposition zurück setzten kann?


  • Administrator

    http://www.cplusplus.com/reference/iostream/istream/seekg.html

    Schau dir allgemein in Zukunft die Referenz für sowas an 😉

    Grüssli



  • ich habe jetzt seekg in meinem code verwendet, trotzdem habe ich noch ein problem

    Mein code bisher:

    srand( time(NULL) );
    int cardnumber;
    string cardname;
    ifstream lesen;
    lesen.open(dateiname.c_str(), ios_base::in);
    
    for(int a=1;a<=35;++a) // soll 35 werte zufällig aus der datei ausgeben
    {
       lesen.seekg (ios::beg); //pointer an den anfang der datei setzten
    
       cardnumber =((20000 +rand()) % anzahlElemente) +1; // zufallszahl zwischen 1 und der anzahl aller werte in der datei erzeugen
    
       for(int b=1;b<=cardnumber;++b) //liest so lange werte ein, bis er an der stelle ist, die durch rand() erzeugt wurde
       {
          lesen>>cardname;
       }
    
    cout<<"Karte: "<<cardname<<" | ID: "<<cardnumber; //ausgeben des Wertes an der durch rand() vorgegebenen Stelle
    }
    lesen.close();
    

    Das klappt auch soweit ganz gut. Nur sobald cardnumber einmal den Wert des letzten Elements der Datei annimmt, wird nur noch dieses elemt ausgegeben.
    Das heißt beim Ausführen des Programms erhalte ich zum Beispiel eine solche ausgabe (inhalt der Datei: Karte1, Karte2, ..., Karte7)

    Karte: karte1 | ID: 1
    Karte: karte3 | ID: 3
    Karte: karte2 | ID: 2
    Karte: karte6 | ID: 6
    Karte: karte6 | ID: 6
    Karte: karte4 | ID: 4
    Karte: karte7 | ID: 7
    [b]Karte: karte7 | ID: 3
    Karte: karte7 | ID: 5
    Karte: karte7 | ID: 1
    Karte: karte7 | ID: 3
    Karte: karte7 | ID: 2
    Karte: karte7 | ID: 4[/b]
    

    Weis jemand, woran das liegen könnte?



  • Du hast dann über das Ende der Datei hinausgelesen und dann wird das Fehlerflag gesetzt, welches solange Bestand hat bis man das Flag wieder von Hand löscht:

    lesen.clear(); // setzt alle Flags zurück - löscht aber KEINE Daten!
    

Anmelden zum Antworten