Datei einlesen



  • Hi,

    ich habe eine DAtei von folgenden Format:

    0,Bodo,100,2000
    1,Dominik,150,2005
    3,Marton,44,44
    #
    0,1,Lanze,100,50
    0,2,Schwert,50,550
    3,2,Stab,50,666
    

    Eine Datei einlesen würde ich so z.B:

    string line;
    		string token;
    		ifstream textfile;                // Quelldatei (Lesen)          
    		textfile.open("Daten.txt", ios::in); // zum Lesen öffnen
    		if (!textfile) {                  // Datei kann nicht geoeffnet werden
    			cerr << "Daten.txt" << " kann nicht geoeffnet werden!\n";
    		}else{
    			while(getline(textfile,line)){		
    				vector<string> inhalt;
    				istringstream iss(line);
    				while(getline(iss,token,','))
    				{
    					inhalt.push_back(token);
    				}
    				iss.clear();
    
    				//konvertierung zu int mal weggelassen
    entryliste.push_back(Entry(inhalt[1],inhalt[0],inhalt[2],inhalt[3]));
    
    				}		
    			}   
    		textfile.close();
    

    Mein Frage ist nun, wie kann ich in der Datei nun bis zu Raute lesen, und dann muss ja die Routine anders aussehen.



  • Hm vllt. jedes zeichen einzeln einlesen und bei jedem zeichen überprüfen, ob das zeichen '#' ist und wenn das zutrifft, beenden?
    (Nur so ne idee)
    gruß,
    Finn



  • while schleife abbrechen.
    falls die raute irgendwo stehen darf:

    if(line.find('#')) break;
    

    Wenn es immer Zeilenanfang ist:

    if(line.count() && line.[0] == '#') break;
    


  • blubberfisch schrieb:

    if(line.count() && line.[0] == '#') break;
    

    Du meinst wohl line.size() oder line.length() . 😉

    Ich schreibe bei mir jedoch meist noch != 0 hin, wenn Zahlen verglichen werden. Hier wäre aber auch empty() eine Möglichkeit...



  • Danke für die Tips.
    Ich bekomme nun allerdigns eine Fehlermeldung.

    "Vector Subskript out of Range"

    void Manager::read_from_textfile(string dateiname)
    {
    
    		string line;
    		string token;
    		int maximumWeight;
    		int currentWeight;
    		int gewicht;
    		int special;
    		int typ_item;
    		unsigned int playernumber;
    
    		ifstream textfile;                // Quelldatei (Lesen)          
    		textfile.open(dateiname.c_str(), ios::in); // zum Lesen öffnen
    		if (!textfile) {                  // Datei kann nicht geoeffnet werden
    			cerr << dateiname.c_str() << " kann nicht geoeffnet werden!\n";
    		}else{
    			while(getline(textfile,line))
    			{		
    				istringstream iss(line);
    				vector<string> inhalt;
    
    				if(line.find('#')) break;	//Bruchkriterium
    
    				//if(line.size() && line.[0] == '#') break;
    
    				while(getline(iss,token,','))
    				{
    					inhalt.push_back(token);
    				}
    				iss.clear();
    
    				stringstream sstr(inhalt[0]);
    				sstr >> playernumber;
    				stringstream sstr2(inhalt[2]);
    				sstr2 >> currentWeight;
    				stringstream sstr3(inhalt[3]);
    				sstr3 >> maximumWeight;
    				//Player_nummer,Name,CurrentWeight,MaximumWeight
    				allPlayers.push_back(Player(inhalt[1],maximumWeight));
    				//allPlayers[playernumber].set_currentWeight(currentWeight);
    
    			}	
    
    			while(getline(textfile,line)){		
    				vector<string> inhalt;
    				istringstream iss(line);
    
    				while(getline(iss,token,','))
    				{
    					inhalt.push_back(token);
    				}
    				iss.clear();
    				//Typ_Item,Playernumer,Name,Gewicht,Feed oder Attack
    				stringstream sstr(inhalt[1]);
    				sstr >> typ_item;
    				stringstream sstr2(inhalt[1]);
    				sstr2 >> playernumber;
    				stringstream sstr3(inhalt[3]);
    				sstr3 >> gewicht;
    				stringstream sstr4(inhalt[4]);
    				sstr4 >> special;
    				allPlayers[playernumber].read_from_file_item(typ_item,inhalt[2],gewicht,special);
    
    				}	
    			}   
    		textfile.close();
    }
    


  • Du greifst auf ein Vektor Element zu, welches gar nicht existiert. Z.B so:

    std::vector<int> v;
    
    std::cout << v[5]; // generiert den Fehler
    

    Ich sehe, dass du ein paar Solche zugriffe hast. Also Debugg das mal, dann siehst du, wo das genau ist.



  • Also das Problem scheint wohl diese Zeile zu sein, für das Abbruchkriterium

    if(line.find('#')) break;    //Bruchkriterium
    

    Wenn das Kriterium erfüllt ist. Bleibt er wohl in der Zeile wo die # steht.
    ER müsste dann aber eine Zeile weiterrücen, damit es passt.



  • ER müsste dann aber eine Zeile weiterrücen, damit es passt.

    Er?

    Die Abfrage ist Sinnfrei, denn wenn die Kondition erfüllt wurde, wird direkt wieder aus der "Schleife" gesprungen.


Anmelden zum Antworten