Problem mit string-Variable
-
1.) String-Literale haben den Typ const char* (Auch bekannt als C-Strings). Im aktuellen Standard musst du die Funktion .c_str() verwenden, um genau so einen zu bekommen. (Im nächsten Standard wird dein Code so funktionieren).
2.) Objekte wie Strings sollte man immer per const-ref nehmen. Also const std::string& oder std::string const&, was dir lieber ist. Der Grund ist, dass bei dir hier ein string kopiert wird, was unter extremen Umständen langsam sein kann.
3.) Vermeide die Funktionen .open() und .close(). C++ Streams können das Wunderbare Prinzip RAII auch. Du kannst den Dateinamen im Konstruktor übergeben, im Destruktor wird der Stream automatisch geschlossen.
Also zusammenfassend so:
void fileOutput(const string& fileName ){ ofstream myfile(fileName.c_str()); myfile << "lalalalalala."; // .close() passiert hier automatisch }
-
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 zuvoid 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