Hilfe zu streams !



  • Da dies mein erster post hier ist erstmal Hallo an alle !

    Nun zu meinem Problem:
    Ich programmiere gerade als kleines Projekt ein Quizspiel mit verschieden Spielmodi. Nun frage ich mich wie man am geschicktesten die Fragen aus einer txt-Datei ausliest. Ich habe mir dass in etwa so vorgestellt.
    z.b: es gibt 60 Fragen in einer txt-Datei. Ein Zufallsgenerator generiert eine Zahl von 1-60 und liest die Dazugehörige Frage aus der txt-Datei. Wenn z.b die Zufallszahl 1 - 20 ist, dann ist die richtige antwort A usw.
    Nun meine eigentliche Frage: Wie kann ich in der txt-Datei die Fragen so durchnummerieren dass er wirklich die zu der Zufallszahl zugehörige Zahl ausliest ????
    Oder gibt es bessere Methoden um die Fragen geschickt auszulesen ?
    wäre über eine Hilfe sehr dankbar.



  • Lies alle Fragen in einen vector, erzeuge eine Zufallszahl und greife dann auf die benötigte Zeile zu.

    MfG Max



  • danke für die schnelle Antwort.
    Geht es auch irgendwie mit streams ??? Denn mit vectoren habe ich noch nie gearbeitet und weiss daher nicht wie es geht.



  • Vectoren sind nicht so kompliziert. Wenn du genau 60 Fragen hast kannst du sie aber auch in ein string Array einlesen. In streams speichert man ja keine Informationen, die benutzt du in deinen Fall nur für das einlesen der Fragen.



  • Lies halt einfach mit einem fstream die Datei zeilenweise aus und speicher jede Zeile (in der je nur eine Frage stehen soll) in einen string. Und die strings kannst du ja alle in einem array/vector speichern.



  • Schau mal in die FAQ, da ist es ganz gut erklärt.

    Devil



  • Ich könnte doch auch in dem fall für 60 fragen 60 textdateien erstellen diese von datei0 bis datei 59 benennen. gibt´es dann einen Befehl der mir wenn die Zufallszahl 39 ist dann auch die datei 39 öffnet ???
    z.b
    zufallszahl=2;

    fstream dh ("datei"<<zufallszahl<<".txt");

    also dieser befehl geht schonmal nicht, hab ich schon ausprobiert.



  • Es gibt überhaupt keine "Befehle" in C++. 🙄



  • abgesehen davon, dass 60 dateien für ein paar kurze fragen ziemlicher unsinn sind, ist es recht kompliziert, die dateinamen zu generieren. mach lieber eine große textdatei und ließ sie ganz in ein string-array (bzw. std::vector)
    geloescht

    PS mit stringstreams kann man die dateinamen recht einfach erzeugen



  • also ich komm irgendwie nicht so recht weiter. Könnt ihr eventuell mal ein konkretes Beispiel geben wie ich 2 zeilen aus einer beliebigen datei zuerst in ein string und dann ein array speichere ??



  • istream& getline (char* s, streamsize n );
    istream& getline (char* s, streamsize n, char delim );

    dein char[] kannst du dann im string-Konstruktor verwenden. Wie du ein Array von strings erstellst, weisst du doch, oder??



  • OK, ich will dir mal helfen:

    struct SFrage
    {
      string Text;
      int Antwort;
    };
    
    vector<SFrage> Fragen;
    ifstream datei("Fragen.txt");
    char tmp[1024];
    SFrage Frage;
    
    while(!datei.eof())
    {
      datei.getline(tmp, 1023);   // Text der Frage lesen
      Frage.Text = tmp;
      datei.getline(tmp, 1023);   // Anwort lesen
      Frage.Antwort = atoi(tmp);
      Fragen.push_back(Frage);    // Im vector speichern
    }
    
    // So, dann darauf zugreifen:
    int zufall = rand() % anzfragen;
    cout << Fragen[zufall].Text  << endl;
    

    ist aber ungetestet. Müsste aber funktionieren



  • die fragen in einen vector einlesen und dann mit dem index (das ist dann eben die zufallszahl) drauf zugreifen.

    int main() {
       vector<string> fragen;
       fstream file("fragen.txt");
    
       for (string frage; getline(file,frage); fragen.push_back(frage)); //einlesen
    
       srand(time(0)); 
       cout << fragen[rand()%fragen.size()] << '\n';  //eine frage ausgeben
    }
    

    das mit den antworten hab ich nicht ganz verstanden.



  • Moin,
    Erstmal danke für die vielen Antworten. Ich habe es jetzt auch endlich mal geschafft die fragen in ein array zu laden ^^. Gibt es auch irgendeine Möglichkeit in der Textdatei kenntlich zu machen dass der Compiler bei der Ausgabe einen Zeilenumbruch macht ?????



  • willst du, dass dein proggi in die datei beim erstellen zeilenumbrüche macht?

    Dann so:

    file << "sonstwas" << endl;



  • Ich dachte eher so: Wenn der Zufallsgenerator die Zahl 29 liefert, dann liest er aus der fragen.txt die zeile 29 ( mit der frage) und aus der antworten.txt die zeile 29 mit den dazugehörigen Antworten. In dieser Zeile der antworten.txt stehen aber 3 antworten. Nun wollte ich wissen wie ich zwischen jede Antwort einen zeilenumbruch bekomme, denn ich lese ja die komplette Zeile in das Array ein.



  • Mal abgesehen davon das ich es für sinnvoller halte die gesamte Datei in deinem Programm abzuspeichern, könntest du einfach anstatt eines Zeilenumbruchs ein bestimmtes Zeichen in die Zeile schreiben, welches dir beim Auslesen sagt das hier die nächste Frage/Zeile anfängt.



  • Warum kein 2D-Array? :

    char arrayname[60][100];

    60 Fragen mit je 100 Zeichen...
    Sollte auch keine Probs beim auslesen geben

    greetz flo


Anmelden zum Antworten