Element eines string vectors in einem string speichern.



  • Hi,
    da bin ich schon wieder.:(
    Ich habe folgendes Problem, ich will ein ellement eines string vectors in einer
    string-methode rurückgeben.
    Ich habe schon einiges Probiert, z.b. das Element des Vectors zurückgegeben, das Programm kompiliert dann und stürtzt leider im Betrieb ab. (Ist ja klar, falscher rückgabe typ)
    Oder wie im folgenden Probiert, das Element in einem String zu speichern.

    Ich habe eine Klasse wo diese methode drinnen ist, die daten wurden schon eingelesen:

    #include <string>
    #include <vector>
    #include <fstream>
    #include <iostream>
    using namespace std;
    
    #include "Streaming.h"
    
    string Streaming::getLineContent(int Line)
    {
             --Line;  
    	string Content;
    	       Content=Vocabulary[Line];// geht nicht
    	return Content;
    }
    

    Wie kann ich das in der Art machen?

    vielen dank im voraus.

    cu max



  • Ist sichergestellt das der Wert von Line ein gültiger Index für den Vector ist ?



  • Master_Max schrieb:

    string Streaming::getLineContent(int Line)
    {
             --Line;  
    	string Content;
    	       Content=Vocabulary[Line];// geht nicht
    	return Content;
    }
    

    So kann das ja nicht gehen; Du gibst eine lokale Variable zurück die bei Verlassen des Scopes zerstört wird.
    Wenn das mit Line sicher passt dann mach doch einfach folgendes:

    string Streaming::getLineContent(int Line)
    {
            --Line;  
            return Vocabulary[Line];// geht nicht
    }
    

    Was genau geht schief wenn Du sowas verwendest?



  • Hallo,

    Mal abgesehen davon, dass man die temporäre Variable hier nicht braucht, sollte sie in diesem Fall aber doch keine Probleme verursachen. Klar sie ist lokal, aber er gibt ja schliesslich weder eine Referenz noch einen Pointer darauf zurück, so dass der Inhalt von Content ja eigentlich nach aussen kopiert werden sollte. Oder sehe ich das falsch ?

    Ciao



  • Nö, das siehst Du richtig



  • Knuddlbaer schrieb:

    Ist sichergestellt das der Wert von Line ein gültiger Index für den Vector ist ?

    Ist sicher gestellt:

    int Streaming::seekEnd()
    {
    	int endLine=0;
    	while(!in.eof())
    	{
    		getline(in,content);
    
    		Vocabulary.push_back(content);
    		++endLine;
    	}
    	return endLine;
    }
    

    nman schrieb:

    So kann das ja nicht gehen; Du gibst eine lokale Variable zurück die bei Verlassen des Scopes zerstört wird.
    Wenn das mit Line sicher passt dann mach doch einfach folgendes:

    Aber ich gebe ja noch die Kopie zurück, die im Aufruf gespeichert wird.

    nman schrieb:

    string Streaming::getLineContent(int Line) 
    { 
            --Line;   
            return Vocabulary[Line];// geht nicht 
    }
    

    Genau das Habe ich probiert (schon davor, meinte ich ja mit das element direkt zurückgeben)dann stürtzt mein Programm ab und ich bekomme "Acces Violattion" oder ähnliches gemeldet

    vielen dank im voraus.

    Braucht ihr noch ein bisschen Code? Oder geht das so?

    cu max



  • Das ist ein bischen wenig. Wir wissen ja nicht was du getLineContent als Line übergibst. Verwende doch zum Zugriff mal at() (macht eine Bereichsüberprüfung) oder teste vorher auf >=0 && <size().



  • Hallo,
    ersteinmal vielen dank an alle.
    Es ist ja getestet, das er die anzahl an Zeilen die in einer
    Textdatei sind findet, das geht.
    Auch das einlesen geht, ich habe es mit einer void funktion getestet,
    die nur eine ausgabe gemacht hat, aber nichts zurückgegeben.
    Ich brauche den wert aber in der main.

    Pseudo Ablauf des Programms:

    Streaming Objekt("....","...");
    int ZeilenInDatei=Objekt.seekEnd();// finde heraus wieviele Zeilen in der Datei
    //sind 
    int Zufallszahl=Zufallszahlfunktion(ZeilenInDatei);// Übergebe die anzahl an
     // zeilen und mache einen zufallswert
    string Inhalt=Objekt.getLineContent(Zufallszahl);// Lese eine Zufällige Zeile 
    // und gebe ihren inhalt zurück
    cout << Inhalt;
    //....
    //.. eingabe von inhalt, überprüfung mit eingabe....
    

    [EDIT]Schrecklichen Schreibfehler behoben 🙄 [/EDIT]

    vielen dank im voraus.

    cu max



  • Zeichen in Dateien != Anzahl der Zeilen der Datei !!!!!!



  • Knuddlbaer schrieb:

    Zeichen in Dateien != Anzahl der Zeilen der Datei !!!!!!

    Schreibfehler, ich verwende ja getline()



  • Hi,
    danke an alle.
    Ok, langsam komme ich auf den Fehlergrund.
    (ich such seit gestern nacht insgesamt schon 3h)

    Es liegt nicht am return der methode, sondern am zweiten objekt das ich erstelle.

    RandomVocabulary, ab dort wo es nicht mehr geht ist auskommentiert worden: (Dies Funktion wird aus der main aufgerufen):

    void randomVocabulary()
    { 		 	
        // Objekte:
        Streaming German("VocabularyGerman.txt","VocabularyGerman.txt");
    
        //zweites Objekt, mit ihm tritt nachher der Fehler ein
        Streaming Language("VocabularyLanguage.txt","VocabularyLanguage.txt")
    
    	 // Muss nur einmal eingelesen werden:
    	 int end;
    	     end=German.seekEnd();
         cout <<end<<endl;
    
    	bool running=true;
    	while(running==true)
    	{	    
    		    int Random=randomValueFunction(end);
             cout <<Random<<endl;
    
    //geht alles noch wunderbar, das Deutsche wird ausgegeben:
        string gContent;
    	       gContent=German.getLineContent(Random);
    	cout <<gContent<<endl;
    
    //ab hier gibt es einen fehler:
    /*
    	string lContent;
    	       lContent=Language.getLineContent(Random);// Dies scheint
    // die Ursache zu sein
    
    // ab hier müsste alles wieder Ok sein:
    	string inVoc;
    	cin.sync();
    	cin.clear();
    	getline(cin,inVoc);
    
    		if(inVoc=="q")
    		{
    		running=false;
    		}
    
    		else if(inVoc==lContent)
    		{
    		cout << "Right"<<endl;
    		}
    
    		else
    		{
    		cout << "Wrong"<<endl;
    		}*/
    	running=false;// damit es keine endlosschleife wird (nur im Test)
    	}
    
     cin.sync();
     cin.clear();
     cin.get();
    }
    

    Die StreamingKlasse
    Streaming.h:

    #ifndef STREAMING
    #define STREAMING
    
    #include <vector>
    #include <fstream>
    #include <string>
    using namespace std;
    
    class Streaming
    {
    private:
    	string content;
    	ifstream in;
    	fstream out;
    	vector<string> Vocabulary;
    public:
    	Streaming(const char *In,const char *Out);
    	~Streaming();
    
    	int seekEnd();
    	string writeLine(string writeContent);
    	string getLineContent(int Line);
    };
    
    #endif
    

    Die Streaming Klasse
    Streaming.cpp, wahrscheinlich liegt es am Konstruktor:

    #include <vector>
    #include <fstream>
    #include <string>
    #include <iostream>
    using namespace std;
    
    #include "StreamingVector.h"
    
    Streaming::Streaming(const char *In,const char *Out)   
    {  
        this->in.open(In,ios::out); //öffnen zum lesen mit Standardoptionen 
        this->out.open(Out,ios::out|ios::in|ios::app);  //öffnen zum schreiben mit Standardoptionen 
    }
    
    Streaming::~Streaming()
    {
    	in.close();
    	out.close();
    }
    
    int Streaming::seekEnd()
    {
    	int endLine=0;
    	while(!in.eof())
    	{
    		getline(in,content);
    
    		Vocabulary.push_back(content);
    		++endLine;
    	}
    	return endLine;
    }
    
    string Streaming::getLineContent(int Line)
    {
    	--Line;
    
    	return Vocabulary[Line];
    }
    

    sorry, das ich soviel poste.
    Die Textdateien existieren im Verzeichnis, zu 100%
    Was mache ich bei der Objekterstellung falsch, das eine Objekt geht ja?

    vielen dank im voraus.

    cu max



  • Ich schreibe es neu, ich finde den Fehler immer noch nicht.

    Danke für alle Antworten.

    cu max



  • Hallo nochmal,

    Sag mal, täusche ich mich oder rufst du für deine Instanz Language die Funktion seekEnd() nicht auf. In dem Fall wäre Language.Vocabulary ja leer. Warum machst du seekEnd nicht gleich im Konstruktor?

    Ciao



  • nein, du hast recht, ein logik problem! in dem vorherigen Programm
    das noch alles in einen String geschrieben habe ich das ja auch so gemacht.

    Ich schäme mich diese Frage gestellt zu haben. 🙄 🙄 😡

    Braunstein, du hast wirklich viel gut bei mir, danke.

    cu max



  • Tatsächlich, ich hatte es übersehen.
    Das kommt davon wenn man mal rechenzeit sparen will.
    Auf den Fehler wäre ich nie gekommen, ich habe debuggt etc.
    aber darauf wäre ich nie gekommen.
    Wahrscheinlich ist auch der blöde methodenname schuld gewesen,
    seekEnd(); abjetzt heißt es: seekAndRead();

    vielen dank.

    was wäre ich wohl ohne dieses Forum? // Ich will eigentlich kein Antwort haben 😃

    cu max



  • Sorry; ich hätte wohl doch ein bisschen schlafen sollen letzte Nacht. 🙂

    Master_Max schrieb:

    Aber ich gebe ja noch die Kopie zurück, die im Aufruf gespeichert wird.

    Eine Kopie gibst Du aber auch mit meinem Code zurück, einfach weil Deine Funktion den Rückgabetyp string hat und nicht string& oä.



  • Jo, daran habe ich ja nicht gezweifelt. 😉
    Letztendlich habe ich deine Version benutzt,
    ich hatte davor ja schon die selbe, sie ging eben blos nicht,
    was aber nicht an ihr lag.

    cu max


Anmelden zum Antworten