Problem mit for-Schleife



  • Hallo!
    Folgender Code:

    void QUESTIONS::Question()	// Stellt Fragen
    {
    	string txt1;
            string end = ".txt";
    	string txt_question_no;
    	int question_no = 1;
    	ifstream question;
    
    	for (question_no = 1; question_no <= 5; question_no++)
    	{
    		string path = "documents/Question/";
    
    		Question_no(&txt_question_no, question_no);
    		path += txt_language;
    		path += level;
    		path += "/";
    		path += txt_question_no;
    		path += end;
    
    		question.open(path.c_str());
    		if (question.is_open())
    		{
    		        question >> txt1;
    		        cout << "Die Datei wurde geöffnet!\n";
    			cout << txt1;
    			cout << endl;
    		}
    		else
    			cout << "I can't find the file!";
    		question.close();
    	}
    }
    

    Die Funktion soll eine Datei öffnen, sie in txt einlesen und txt auslesen. Dabei verändert sich aber immer ein Teil des Pfades, nämlich question_no. Deshalb mach ich das mit einer for Schleife. Beim ersten Durchlauf passt alles, aber bei den anderen 4 wird immer das gleiche wie beim 1. ausgegeben. Was ist falsch?

    Danke im Voraus,
    Jonny



  • Du öffnest die Datei in der Schleife jedes mal neu. Nur einmal vor der Schleife öffnen.

    Des weiteren:
    - Die Variablenbezeichner sind unausagekräftig, darunter kann sich _keiner_ etwas vorstellen.
    - Mach den Bezeichner der Klasse besser nicht nur in Caps, sonst sieht das noch aus wie ein Makro, da macht man das oft.

    Gruß



  • Funktioniert leider nicht. Kann ja auch nicht, weil path ja erst später definiert wird. Und dann immer wieder neu... Oder seh ich das falsch?
    Bei den anderen Sachen geb ich dir Recht.

    Jonny



  • Nun versteh ich das erst. Wie gesagt der Code ist sehr unübersichtlich. Versuchs mal so (hab den Fehler nicht gesucht, nur was neues):

    void readQuestions()
    {
        for(int i=0; i<5; ++i) {
    
            // Filename erzeugen 
            ostringstream filename;
            filename << "path\\to\\file\\" << i << ".txt";
    
            // Datei öffnen
            ifstream file(filename.str().c_str());
            if(!file.is_open()) {
                throw "Booom!";
            }
    
            // Ausgeben
            copy(istream_iterator<char>(file), istream_iterator<char>(), ostream_iterator<char>(cout));
    
        }    
    }
    

    Gruß



  • Okay, bis zur letzten Zeil komm ich mit, aber die copy anweisung versteh ich nicht.
    Aber du veränderst ja nur die zusammensetzung des Pfads. Den hab ich mir mal immer ausgeben lassen, der ist richtig...

    Aber ich hab mal eine andere Idee aus deinem Beispiel aufgegriffen und direkt bei der deklaration des ifstream den Pfad angegebn und nicht mittels der open() methode. Und siehe da: Es funktioniert, warum weiß ich nicht.

    Ihr?

    Danke,
    Jonny



  • ich vermute, der fehler liegt in der funktion Question_no().



  • Hier ist sie:

    void QUESTIONS::Question_no(string *ptxt_question_no, int question_no)
    {
    	switch (question_no)
    	{
    	case 1: *ptxt_question_no = "1";
    		break;
    	case 2: *ptxt_question_no = "2";
    		break;
    	case 3: *ptxt_question_no = "3";
    		break;
    	case 4: *ptxt_question_no = "4";
    		break;
    	case 5: *ptxt_question_no = "5";
    	}
    }
    

    Sie konvertiert (wenn auch auf umständliche Weise) den int question_no in einen string.

    Gruß,
    Jonny



  • einen fehler kann ich nicht entdecken.

    question>>txt1 liest den text nur bis zum ersten leerzeichen ein. vielleicht ist das erste wort ja in allen dateien gleich?



  • Ich hab zum test erstmal nur a,b,c,d,e genommen...


Anmelden zum Antworten