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,666Eine 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()oderline.length().
Ich schreibe bei mir jedoch meist noch
!= 0hin, wenn Zahlen verglichen werden. Hier wäre aber auchempty()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 FehlerIch 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; //BruchkriteriumWenn 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.