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 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.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!


Anmelden zum Antworten