Problem mit string-Variable



  • CStoll schrieb:

    PPS: Für das open()/close() wird bestimmt noch eine ausführlichere Erklärung kommen, warum es überflüssig ist.

    😃



  • Danke für die schnellen Antworten!
    Also das mit dem const& usw. kann ich noch nicht so richtig "nachvollziehen", da fehlt mir einfach noch das Wissen ^^'
    Aber es klappt auf jeden Fall, danke 😎



  • ganonlight schrieb:

    Also das mit dem const& usw. kann ich noch nicht so richtig "nachvollziehen", da fehlt mir einfach noch das Wissen ^^'

    Dann versuchen wir es mal mit der Kurzfassung: Einen String zu kopieren kann verhältnismäßig teuer werden, wegen der Speicherverwaltung und der Umkopiererei des Inhalts. Wenn es nicht notwendig ist, erspart man sich das, indem man nur einen Verweis auf den ursprünglichen String übergibt - und damit die Funktion nicht versehentlich das Original kaputt macht, wird dieser Verweis mit const erweitert. Das Ergebnis ist dann der Parameter const string& fileName .



  • ganonlight schrieb:

    Danke für die schnellen Antworten!
    Also das mit dem const& usw. kann ich noch nicht so richtig "nachvollziehen", da fehlt mir einfach noch das Wissen ^^'
    Aber es klappt auf jeden Fall, danke 😎

    Mit dem Referenz-Operator & übergibst du quasi die Adresse unter der die Variable abgelegt ist, sprich das Original wird übergeben. Wie 31415.. (komplizierter Name 😃 ) ja schon angedeutet hat vermeidest du so sinnloses hin und her kopieren 😉 const sagt nur aus, dass die entsprechende variable konstant ist, also nicht abgeändert werden darf.

    -edit- war jemand schneller 🙂



  • Achso ok, jetzt versteh ichs^^
    Aber ich hab doch noch ein Problem damit: Es gibt zwar so keinen Fehler:

    void fileOutput(const string& fileName ){
         ofstream myfile(fileName.c_str());
         myfile << "lalalalalala.";
         // .close() passiert hier automatisch
    }
    

    Aber der Text in der File wird dann gar nicht geändert.
    Wenn ichs so mache, also mit dem normalen String funktionierts:

    void fileOutput(string fileName ){
         ofstream myfile(fileName.c_str());
         myfile << "lalalalalala.";
         // .close() passiert hier automatisch
    }
    

    ??



  • Übergibst du denn in beiden Beispielen den selben (gültigen) Dateinamen? Ansonsten solltest du mal nachsehen, ob der Stream ordentlich geöffnet werden konnte:

    void fileOutput(const string& fileName ){
        ofstream myfile(fileName.c_str());
        if( !myfile)
            cerr << "Fehler beim Öffnen der Datei " << fileName << endl;
        myfile << "lalalalalala.";
    }
    


  • Ja, bei beidem hab ich den gleichen string übergeben.
    Was sollte denn bei deinem Code jetzt passieren? Also bei mir zumindest passiert nichts



  • Ich hatte eigentlich gehofft, daß die if()-Bedingung zuschlägt und eine Fehlermeldung herausgibt. Ansonsten: Woran erkennst du, ob etwas geschrieben wurde?



  • Wo hätte ich denn die Fehlermeldung lesen sollen? Ich kenn mich ja kein bisschen aus ^^', vielleicht hab ichs nur nicht gesehn
    Naja, ich schau einfach in der Text-datei, ob sich was geändert hat.



  • ganonlight schrieb:

    Wo hätte ich denn die Fehlermeldung lesen sollen? Ich kenn mich ja kein bisschen aus ^^', vielleicht hab ichs nur nicht gesehn

    cerr-Ausgaben landen normalerweise im Konsolen-Fenster, aber wenn du keins hast, könnte das etwas schwierig werden.

    Naja, ich schau einfach in der Text-datei, ob sich was geändert hat.

    Wie kann sich denn am Datei-Inhalt etwas ändern, wenn du immer den selben Text reinschreibst? Achte mal auf das Änderungsdatum - oder ergänze den Stream-Konstruktor zu ofstream myfile(fileName.c_str(),ios::app); .



  • CStoll schrieb:

    Wie kann sich denn am Datei-Inhalt etwas ändern, wenn du immer den selben Text reinschreibst?

    Im Programm hab ich natürlich schon immer was anderes reinschreiben lassen. Und das Änderungsdatum hat sich nicht geändert, durch myfile(fileName.c_str(),ios::app); ist auch nichts passiert

    EDIT:
    Aaach, ich hab den Fehler gefunden:
    Ich hab vergessen, dass ich auch bei dem Deklarieren der Methode den Konstruktor ändern muss, also zu

    void fileOutput( const string& );
    

    Sry, wie gesagt, ich bin noch ein Anfänger in C++ ^^'
    In Java gabs das mit dem Methoden deklarieren ja auch gar nicht, da hab ich dann nicht dran gedacht ^^'
    Jetzt gehts, danke nochmal 🙂


Anmelden zum Antworten