Streams
-
Ich möchte gerne meine Programmausgabe entweder nach cout oder in eine Datei schreiben. Dazu habe ich folgendes ausprobiert:
// Minimalbeispiel #include <iostream> #include <fstream> void foo(const char* filename) { std::ostream& out = std::cout; std::ofstream fout; if(filename != 0) { fout.open(filename); out = fout; } out << "Holla!" << std::endl; } int main() { foo(0); foo("test.txt") return 0; }Das fliegt mir aber um die Ohren; wie kann ich das reparieren bzw. wie kann ich das anders lösen?
/usr/include/c++/4.2.1/bits/ios_base.h: In member function ‘std::basic_ios<char, std::char_traits<char> >& std::basic_ios<char, std::char_traits<char> >::operator=(const std::basic_ios<char, std::char_traits<char> >&)’: /usr/include/c++/4.2.1/bits/ios_base.h:782: error: ‘std::ios_base& std::ios_base::operator=(const std::ios_base&)’ is private /usr/include/c++/4.2.1/iosfwd:55: error: within this context /usr/include/c++/4.2.1/iosfwd: In member function ‘std::basic_ostream<char, std::char_traits<char> >& std::basic_ostream<char, std::char_traits<char> >::operator=(const std::basic_ostream<char, std::char_traits<char> >&)’: /usr/include/c++/4.2.1/iosfwd:64: note: synthesized method ‘std::basic_ios<char, std::char_traits<char> >& std::basic_ios<char, std::char_traits<char> >::operator=(const std::basic_ios<char, std::char_traits<char> >&)’ first required here stream.cpp: In function ‘void foo(const char*)’: stream.cpp:10: note: synthesized method ‘std::basic_ostream<char, std::char_traits<char> >& std::basic_ostream<char, std::char_traits<char> >::operator=(const std::basic_ostream<char, std::char_traits<char> >&)’ first required here stream.cpp: In function ‘int main()’: stream.cpp:22: error: expected `;' before ‘return’
-
Also ich programmiere auch noch nicht so sehr lange mit c++, also falls ich was falsches sag schonmal sorry.
aber erst mal ne frage...du hast schon erst mal bevor du den code reinkopierst dir deine compiler fehlermeldungen durchgeschaut und geguckt an was es legen könnte???
denn dann wär dir erst mal aufgefallen dass du dass ";" in Zeile 21 vergessen hast.Also so wie ich das kenne mit dem streams und ein und ausgaben in und von dateien, ist das komplett falsche bzw kenn ich nicht.
was genau willst du machen?
du willst ein programm dass etwas in eine datei schreibt oder auf dem bildschirm ausgibt???
was heißt bei dir das oder?sorry falls ich es falsch verstanden hab.
-
fr33g schrieb:
denn dann wär dir erst mal aufgefallen dass du dass ";" in Zeile 21 vergessen hast.
Das war ein copy-paste-Fehler und nicht der Fehler, den ich suche.
fr33g schrieb:
du willst ein programm dass etwas in eine datei schreibt oder auf dem bildschirm ausgibt???
was heißt bei dir das oder?Genau das: Entwder Ausgabe in eine Datei, oder nach cout. In diesem Beispiel wird soll das unterschieden werden, je nachdem, ob filename ein Null-Pointer ist oder nicht.
-
Falls es einfacher zu lesen ist, nochmal die Fehlermeldung mit dem ; hinter foo(...):
/usr/include/c++/4.2.1/bits/ios_base.h: In member function ‘std::basic_ios<char, std::char_traits<char> >& std::basic_ios<char, std::char_traits<char> >::operator=(const std::basic_ios<char, std::char_traits<char> >&)’: /usr/include/c++/4.2.1/bits/ios_base.h:782: error: ‘std::ios_base& std::ios_base::operator=(const std::ios_base&)’ is private /usr/include/c++/4.2.1/iosfwd:55: error: within this context /usr/include/c++/4.2.1/iosfwd: In member function ‘std::basic_ostream<char, std::char_traits<char> >& std::basic_ostream<char, std::char_traits<char> >::operator=(const std::basic_ostream<char, std::char_traits<char> >&)’: /usr/include/c++/4.2.1/iosfwd:64: note: synthesized method ‘std::basic_ios<char, std::char_traits<char> >& std::basic_ios<char, std::char_traits<char> >::operator=(const std::basic_ios<char, std::char_traits<char> >&)’ first required here stream.cpp: In function ‘void foo(const char*)’: stream.cpp:11: note: synthesized method ‘std::basic_ostream<char, std::char_traits<char> >& std::basic_ostream<char, std::char_traits<char> >::operator=(const std::basic_ostream<char, std::char_traits<char> >&)’ first required here
-
Ah, verdammt... ich glaube, ich begreife. out ist eine Referenz auf std::cout. Mit der Zuweisung versuche ich, meinen file-Stream std::cout zuzuweisen. Das ist natürlich unsinn. Ich könnte das einfach mit einem Pointer auf einen ostream machen... dann kann ich die Adresse ändern. Nur der Syntax wird dann weniger hübsch.. dann muss ich immer sowas schreiben wie
(*out) << "Mein Text" << std::endl;Habt ihr noch nen hübscheren Vorschlag? Immerhin sollte meine Idee so klappen.
-
Nimm einen Pointer statt einer Referenz, dann gehts:
void foo(const char* filename) { std::ostream* out = &std::cout; std::ofstream fout; if(filename != 0) { fout.open(filename); out = &fout; } *out << "Holla!" << std::endl; }Wie die Fehlermeldung schon sagt, ist der Zuweisungsoperator (operator=) private, d.h. du kannst streams nicht einander zuweisen.
-
Mups schrieb:
Ich möchte gerne meine Programmausgabe entweder nach cout oder in eine Datei schreiben.
guckst Du hier (schreiben nach cout UND in Datei) oder hier (Umleiten von cout in eine Listbox) oder hier (cout nach Memory umleiten).
Ersetze beim letzten Beispiel den MemBuf durch den filebuf des ofstreams - dann hast Du das was Du brauchst.
-
Mups schrieb:
fr33g schrieb:
denn dann wär dir erst mal aufgefallen dass du dass ";" in Zeile 21 vergessen hast.
Das war ein copy-paste-Fehler und nicht der Fehler, den ich suche.
fr33g schrieb:
du willst ein programm dass etwas in eine datei schreibt oder auf dem bildschirm ausgibt???
was heißt bei dir das oder?Genau das: Entwder Ausgabe in eine Datei, oder nach cout. In diesem Beispiel wird soll das unterschieden werden, je nachdem, ob filename ein Null-Pointer ist oder nicht.
ich wollte damit ja auch nicht sagen dass dass der fehler ist, sondern einer der fehler, und wenn sein compiler fehler meldet, schaut man sie sich ja normal erst mal an, und dachte das wär dir dann ja aufgefallen;-)
aber ist ja jetzt egal:D
dein prob ist ja gelöst;-)grüße
-
oder so:
void foo(std::ostream& out) { out << "Holla!" << std::endl; } void foo(const char* filename) { if(filename != 0) { std::ofstream fout(filename); foo(fout); } else { foo(std::cout); } }