frage zur dynamischen variablen erzeugung



  • Erstmal guten abend (so viel zeit muss sein ;)),

    Ich möchte eine Datei einlesen (for oder while schleife, oder gibts ne Möglichkeit ohne Schleife?), welche eine unbestimmte anzahl von wörtern, eins pro zeile, enthält.

    Die Wörter sollen dann jedes in eine Variable gespeichert werden. (Soweit dürfte es kein Problem sein.)
    Die Variablen müssen nach der Beendignung der Schleife noch existieren (aber jetzt schon, soweit ich weis verlieren Variablen nach Beendigung der Funktion, in der sie erzeugt wurden (also in der for oder while Schleife), ihr Gültigkeit.).

    Und das beste is, ein Thread der später im Programm gestartet wird muss Zugriff auf jede dieser Variablen haben.

    Wie stell ich das an?

    #include <iostream>
    #include <fstream>
    using namespace std;
    
    main()
    {    
        // Als erstes muss ich die Datei einlesen !
        // Objet eingabe erzeugen
        fstream eingabe;
        // Datei Öffnen
        eingabe.open("Datei.txt",ios::in);
        // an Datei Anfang springen
        eingabe.seekg(0L,ios::beg);
    
        // Auslesen beginnen und erstes Zeichen holen
        while (!eingabe.eof())
        {
            // so, und jetzt ?
            // jetzt müsste jede Zeile bis zum \n oder \0 in der Datei ausgelesen werden, 
            // in einer Variable abgelegt werden und für den Rest vom Programm verfügbar gemacht werden (Thread).
        }
    
    ~~~~
    
        //Thread wird erzeugt
    
    ~~~~
    
       // Programm beenden und alle dynamischen Variablen freigeben
       free(...);
       exit(0);
    }
    

    Kann mir da jemand helfen das zu lösen oder mir nen Denkanstoss geben?

    Danke



  • Code-Yunkee schrieb:

    Kann mir da jemand helfen das zu lösen oder mir nen Denkanstoss geben?

    Schau mal in die FAQ, std::vector und Co helfen Dir weiter.



  • Hab in der FAQ nix gefunden, hast mir da nen link ? Oder ne deutsche Lektüre dazu im Netz ?
    Hab umehrlich zu sein noch nie was mit vector zu tun gehabt.

    Thx



  • Hier wird vector gemeinsam mit fstream verwendet. Eine genauere Erklärung findest Du in jedem brauchbaren C++-Buch.

    Im Grunde brauchst Du nicht mehr zu tun, als folgendes:

    std::vector<int> zeugs;
    zeugs.push_back(7);
    zeugs.push_back(4);
    zeugs.push_back(9);
    zeugs.push_back(2);
    

    Und in zeugs[0] bis zeugs[3] findest Du die eingefügten Werte wieder.
    Aber wie gesagt, lies dazu lieber im C++-Buch Deiner Wahl nach.



  • ok, hab jetzt soweit verstanden wie das mit vector funzt.

    nur wenn ich jetzt eine vector<string> variable global deklarier, wie frag ich dann zb das erste
    element ab?

    vector<string> wort;
    
    void WortLaden()
    {    
    
    ~~
    wort mit mir werten versogt
    ~~
    
    	for (int a = 0; a < 5; a++)
    	{
    		cout << wort.at(a) << endl;
    	}
    }
    

    Bekomm ich folgende Meldung vom Compiler:

    error C2679: Binaerer Operator '<<' : Kein Operator definiert, der einen rechtsseitigen Operator vom Typ 'class std::basic_string<char,struct std::char_traits<char>,class std::allocator<c
    har> >' akzeptiert (oder keine geeignete Konvertierung moeglich)



  • ich bin ein wenig überrascht, denn ob du es global machst oder nicht,
    sollte imho nichts daran ändern, dass es einen operator << für std::string gibt.
    Naja der fehler gehta auch vom binären << aus, was ich merkwürdig finde.
    Ich hab grad das hier getestet

    #include<iostream>
    #include<vector>
    #include<string>
    
    int main(){
    	std::vector<std::string> zeugs;
    	zeugs.push_back("7");
    	zeugs.push_back("4");
    	zeugs.push_back("9");
    	zeugs.push_back("2");
        for (int a = 0; a < 4;++a)
        {
            std::cout << zeugs.at(a) << std::endl;
        } 
    
    }
    

    und es lief völlig einwandfrei durch. ob der vector nun in der main oder global deklariert war...



  • ok, das funzt.

    hatte vergessen die <string> einzubinden.

    Jetzt hab ich mal ne ganz andere frage.

    Ich habe bis jetzt in C programmiert und seh grad dass es sich von C++ doch sehr stark unterscheidet.

    in C++ verwendet man also eher string als char oder seh ich das jetzt falsch ?

    wenn man mit vector und string ja eigentlich alles machen kann was ein char bzw array kann,
    wozu braucht man dann noch char ? Für einzelne Zeichen ?

    ich habe in dem Code den ich schreibe unter den #includes using namespace std; stehen. Du allerdings nicht, dafür schreibst du jedesmal std:: vor die funktion. Welchen Unterschied macht das ?

    Und nochwas *fg*, in C verwende ich sprintf um Text und andere Variablen in eine bestimmte Variable zu schreiben.

    sprintf(constr,"%s",test);
    

    Wie lautet das eqvivalent für C++ ? Oder ist auch hier sprintf zu verwenden ?
    Wenn ja, welchen Platzhalter verwendet man dann für ein vector element ? mit %s stürzt das Prgramm ab ?

    sprintf(constr,"%s",v.at(1)); // Stürzt ab
    

    Das zusammenschneiden bis string geht ja über das + , aber wenn ich ein element eines vectors hinzufügen will, geht das ja nich:

    string constr = "Element 1 von vecotr v " + v.at(1);
    

    Das bringt mir dann aber : Zeiger können nicht addiert werden.

    Fragen über Fragen.

    Danke schonmal dass ihr nem C++ Neuling bißchen auf die Sprünge helft.



  • in C++ verwendet man also eher string als char oder seh ich das jetzt falsch ?

    In 99% der Fälle: Ja.

    wozu braucht man dann noch char ? Für einzelne Zeichen ?

    Manchmal meint einer, der vector oder der string frisst zuviel Speicher und Ressourcen, dann nimmt er wieder char[]. Aber char kann z.B. ganz nützlich sein, um einen einzelnen Buchstaben einzulesen, vgl. Menüauswahl.

    Wie lautet das eqvivalent für C++ ? Oder ist auch hier sprintf zu verwenden ?

    Nope, es gibt stringstreams, siehe FAQ ("Einmal Zahl nach String" oder so).

    Und vector kann man so ausgeben:

    vector<int> myVec;
    for (int i=0;i<10;++i) {
      myVec.push_back(i);
      cout<<myVec[i]<<'\n';
    };
    
    //Oder mit Iteratoren
    for (vector<int>::iterator i=myVec.begin();i!=myVec.end();++i)
      cout<<*i<<'\n';
    


  • std::vectors kann man auch via std::copy nach std::cout ausgeben, das dürfte wohl am elegantesten und schnellsten sein.



  • wie ich den vector ausgebe, hab ich mittlerweile begriffen 😉

    aber wie das mit den stringstreams läuft hab ich net verstanden.

    Sagen wie mal ich möchte das 3 element von vector v in einen string kopieren.

    der string soll nacher das ausgeben: Element 3 von vector v ist Hallo.

    ich würde jetzt davon ausgehen, dass man das so macht:

    vector<string> v;
    v.push_back("Test");
    v.push_back("Ich");
    v.push_back("Hallo");
    
    string Ausgabe = "Das 3. Element von vector v ist " + v.at(3);
    
    cout << Ausgabe << endl;
    

    Ich brauch das in nem string weil der string nachher weitervearbeitet wird.

    Aber wie gesagt, dann kommt Zeiger kann nicht addiert werden.

    Wie mach ich das jetzt mit stringstreams ?

    stringstream str;
    
    str << "Das 3. Element von vector v ist " + pws.at(a);
    
    cout << "str: " << str.str() << endl;
    

    Das geht ja auch nich. Man man man, wäre ich doch bloß bei C geblieben 😉



  • Kleines Beispiel

    #include <iostream>
    #include <string>
    #include <sstream>
    #include <vector>
    #include <algorithm>
    #include <iterator>
    
    using namespace std;
    
    int main() {
       vector<string> v;
       v.push_back("Test");
       v.push_back("Ich");
       v.push_back("Hallo");
    
       stringstream str;
       copy(v.begin(), v.end(), ostream_iterator<string> (str, ","));
       cout << str.str() << endl; 
       str.str("");
       str << v[1] << " sage " << v[2] << endl;
       string s = str.str();
       cout << s;
       return 0;
    }
    

    Kurt



  • Code-Yunkee schrieb:

    vector<string> v;
    v.push_back("Test");
    v.push_back("Ich");
    v.push_back("Hallo");
    
    string Ausgabe = "Das 3. Element von vector v ist " + v.at(3);
    
    cout << Ausgabe << endl;
    

    Kleiner Hinweis: Auch in Vektoren beginnt der Index bei 0 - d.h. du versuchst auf ein (nicht existierendes) viertes Element zuzugreifen.
    Ich brauch das in nem string weil der string nachher weitervearbeitet wird.

    Wie mach ich das jetzt mit stringstreams ?

    Wenn du die Daten direkt ausgeben willst, brauchst du den Umweg über stringstream übrigens nicht - dafür gibt es cout:

    cout<<"Das 3. Element von v ist "<<v.at(2);
    


  • ok, hab ich jetzt begriffen 😉

    1000 Danke für eure Hilfe.

    Hab zwar noch eine Frage, die hat aber nichts mit diesem Thema zutun und deshalb neuer Thread 😉


Anmelden zum Antworten