Subscript Fehler
-
Hallo,
habe mal wieder ein Problem. Ich habe ein Programm geschrieben dass mir ein Textfile zeilenweise in einen Stringvektor einliest.
Währenddessen sollen Signalwörter gefunden werden, was auch klappt. Nun will ich einen Substring ausschneiden, was auch noch klappt. Wenn ich diesen Substring namens sub jedoch in einen Stringvektor wie schon weiter oben im Prog schreiben will, kommt bei erfolgreichen Kompilieren und Starten des Programms der Fehler: "vector subscript out of range"
Wie kann ich das Problem lösen?
Hier ist das Programm:
#include<string> #include<fstream> #include<iostream> #include<vector> #include<string> using namespace std; int main() { vector<string>stringvec; // Stringvektor, schreibt Scicos-Zeilen in Vektor ifstream file; // Eingabestrom string filename; // damit der Quelldateiname als String eingelesen werden kann cout << "Quelldatei? "; // Ausgabe cin >> filename; // Datei mit Pfad eingeben file.open(filename.c_str(), ios::binary|ios::in); // Datei oeffnen // Ohne {\tt ios::binary} sind nur Textdateien kopierbar if (!file) // Fehlerüberprüfung { std::cerr<<filename<< "Datei wurde nicht gefunden!\n"; } std::string line; // Definition des Zeilen-Strings std::string wordtofind("exprs"); std::string::size_type result=0; int z=0; int i=1; vector<string>wert1; // Stringvektor, schreibt Verstärkungsfaktor Kp in Vektor //vector<string>vecT; // Stringvektor, schreibt Zeitkonstante T in Vektor while(!file.eof()) { getline(file, line); // Zeilenweise einlesen stringvec.push_back(line); // push_back: Zeilen werden hintereinander hinzugefuegt ++z; // Zählt Anzahl der Zeilen mit if (result=line.find(wordtofind,result) !=string::npos) { std::cout<<line<<std::endl; // Ausgabe der wordtofind-Zeilen ++result; // Ab der nächsten Stelle suchen cout<<"Zeile: "<<z<<endl; string sub=line.substr(35); wert1[i]=sub; cout<<sub<<endl; ++i; } } cout<<"Anzahl der Zeilen: "<<z<<endl; // Ueberpruefung cout<<stringvec[38]<<endl; // Ueberpruefung int halt; cin>>halt; // Alibi-Anhalten des Programms return 0; }//Edit: CodeTags
-
Du kannst nicht einfach mit vec[3] = "..."; in einen Vektor schreiben. Der hat ja eine variable Größe, angefangen mit der Größe 0.
Daher entweder mit resize (oder beim Erstellen) eine Größe mitgeben oder mit push_back(...) Elemente anhängen. Falls die Größe vorher bekannt ist, kann vorher mit einem reserve(...) Platz reserviert werden, was unnötiges (internes) Herumkopiere erspart.
-
wert1 ist (und bleibt) ein leerer Vektor, weil du nie etwas anhängst oder einfügst. Der []-Operator sorgt jedenfalls nicht für ein automatisches Anlegen des referenzierten Elements.
-
Ah ok danke. Aber wenn ichs so verbessere, kmpiliert ers mir gar nicht erst:
...
while(!file.eof())
{
getline(file, line); // Zeilenweise einlesen
stringvec.push_back(line); // push_back: Zeilen werden hintereinander hinzugefuegt
++z; // Zählt Anzahl der Zeilen mitif (result=line.find(wordtofind,result) !=string::npos)
{
std::cout<<line<<std::endl; // Ausgabe der wordtofind-Zeilen
++result; // Ab der nächsten Stelle suchen
cout<<"Zeile: "<<z<<endl;
string sub=line.substr(35);
wert1.pushback(sub);
cout<<sub<<endl;
++i;
}
...Versteh ich nicht..
-
Es heißt ja auch push_back und nicht pushback. Ein wenig mehr Sorgfalt sollte schon sein.
-
Ok peinlich....
hab push_back falsch geschrieben. jetzt gehts. Danke an alle!