ofstream und Funktionen
-
Hallo,
gibt es irgendwas, was ich beachten muss, wenn ich eine ofstream variable na eine Funktion übergebe? Schaut mal bitte:int main()
{
ofstream dbText;
dbText.open("dbText.txt",ios::app);
writeTxtFile(dbText);
return 0;
}int writeTxtFile(ofstream stmTxt)
{
stmTxt<<"test";
return 0;
}wieso geht das nicht? Ich übergebe einen geöffneteten ofstream und will dann in der Funktion reinschreiben. Das klappt auch, die Datei wird erzeugt und der Text reingeschrieben. Allerdings stürzt danach das Programm ab mit einer Exe. Fehlermeldung. Woran liegt das?. sowas hab ich meist, wenn ich unsinn mit einem zeiger gemacht hab. Geht das indie richtung. Ich dachte schon mal, ob man einen stream nur als zeiger übergeben darf oder so? Hat jemand einen tipp für mich?
grüße
paloncino
-
musst stream per referenz übergeben.
-
grundlegend fürs board NUTZE CODE-TAGS !!!
zu deinem Problem:
#include <iostream> #include <fstream> #include <string> using namespace std; void writeTxtFile(string); int main() { string dateiname; cout << "geben sie einen dateinamen ein: "; cin >> dateiname; writeTxtFile(dateiname); return 0; } void writeTxtFile(string datei) { ofstream dieDatei; dieDatei.open(datei.c_str(),ios::app); dieDatei << "test"; }
edit(volkard): dir richtigen code-tags, also [cpp statt [code eingebaut. *lächel*
-
Hallo,
danke für die Hilfe. Das war's. Ich dachte es mir schon, allerdigns hätte ich mehr auf Argumentübergabe per Zeiger getippt. Also als Referenz. Das hab ich probiert,wie gesagt, es löst mein Problem
Gibt es eine technische Erklärung, warum man per Referenz übergeben muss? Ich dachte, der ofstream wäre eine ganz normale Variable. Ich lerne noch nicht so lange C++ und es ist mir ohnehin neu, dass man zwingend Referenzen benutzen muss. Ich dachte immer, es wäre eine Option.
Das mit den code tags, ich muss mich mal schlau machen, wie das überhaupt geht. Ich verwende sie dann in zukunftdanke nochmal ..paloncino
-
Du kannst ihn per Referenz übergeben, du kannst ihn per Zeiger übergeben. Was du nicht kannst ist Kopieren
protected: ostream(); ostream(const ostream&); // treat as private ostream& operator=(streambuf*); // treat as private ostream& operator=(const ostream& _os) {return operator=(_os.rdbuf()); }
-
Btw: der Code von Enno-Tyrant ist auch nicht das Wahre, denn 1. beantwortet er die Frage ncht, 2. wird hier unnötig kopiert.
So würde ich das machen:void writeTxtFile(std::ostream& o);
Der Rest bleibt gleich, mit dem Unterschied, dass es klappt. Nennt sich übergäbe per referenz...
Nach Enno-Tyrant:void writeTxtFile(const std::string& s);
Hier können wir sogar per konstanter Referenz übergeben und typumwandlung erlauben, weil c_str() meines Wissens nach const corectness hat...
-
Gibt es eine technische Erklärung, warum man per Referenz übergeben muss?
Ja. ofstream besitzt keinen aufrufbaren Copy-Ctor. Ein solcher wird aber für eine "by-value"-Übergabe benötigt.
Der Grund das ofstream keinen Copy-Ctor besitzt liegt darin, dass es keine eindeutige Semantik für das Kopieren eines ofstreams gibt. Ein ofstream ist mit einer physischen Datei verbunden. Was soll kopieren da bedeuten? Kopieren der Datei? Kopieren des "Handles"? Kopieren des "Handles" sowie des aktuellen Lesezustands?
Da es hierauf keine eindeutige antwort gibt, verbietet man das Kopieren einfach und erspart sich somit die Probleme.