String in Datei schreiben
-
Ich sagte ja habe statt "Hallo Hallo geschrieben. Der Text sieht so aus:
fstream g; string Gruss = "Hallo"; g << Gruss;
@out: Was meinst du mit g weiss nicht wohin er schreiben muss?
-
jenny.caros schrieb:
@out: Was meinst du mit g weiss nicht wohin er schreiben muss?
Ich meinte, du hast g nicht gesagt, in welche Datei er schreiben soll.
-
Hier ist es nochmal komplett.
#include <fstream> using namespace std; int main() { string Gruss = "Hallo"; fstream g; g.open("Test.txt", ios::out); g << "Dieser Text geht rein" << endl; g << Gruss; g.close(); }
Der Dateiname ist Test.txt. Wieso kann das Gruss nicht in g rein.
-
Merke:
Poste bei so kurzen Codes am Besten immer die komplette Version. Jeder hier ging davon aus, dass das der komplette Code war und das hat zu Irritationen geführt und uns alle Zeit gekostet. Bitte auch keinen Code im Forum nachcoden, sondern immer aus dem Quelltext direkt kopieren.Edit:
Hier stand Käse, sorry.
-
@Eisflamme: ja ok. Aber trotzdem geht Gruss nicht in g rein, obwohl es ein String ist. Und "Dieser Text geht rein" geht in g rein, obwohl es wie Gruss ein String ist. Warum?
-
#include <string>
fehlt.Was genau meinst du mit "geht nicht rein"? Hast du eine Fehlermeldung? Welche? Passiert etwas unerwartetes beim Ausführen? Was beobachtest du?
-
@SeppJ: Habe die Fehlermeldung leider gerade nicht vor mir, nur bei dem
g << Gruss;
ist unter dem << ein roter Strich. Das heisst es gibt ein Problem mit dem <<.
-
Oder MSVC hat Mist gebaut.
Kompilierts denn?
Wenn ja, was genau steht am Ende in der Datei?
Wenn nein, Fehlermeldung posten.
-
jenny.caros schrieb:
g << Gruss;
ist unter dem << ein roter Strich. Das heisst es gibt ein Problem mit dem <<.
Ah, ja klar. Das heißt, der Compiler kennt die Methode nicht. Die müsstest du ihm noch bekannt machen. Ich schlage include <string> vor.
-
SeppJ meinte auch ich soll #include <string> einfügen. Nur was heisst genau er kennt die Methode nicht?
-
jenny.caros schrieb:
SeppJ meinte auch ich soll #include <string> einfügen. Nur was heisst genau er kennt die Methode nicht?
Eine Methode ist eine Memberfunktion, also eine Funktion einer Klasse. Um eine Funkion auszuführen, muss der Compiler sie kennen, logisch. Du willst eine Funktion die via "string" bekannt gemacht wird, also führt kein Weg an include <string> vorbei.
-
jenny.caros schrieb:
SeppJ meinte auch ich soll #include <string> einfügen. Nur was heisst genau er kennt die Methode nicht?
Du benutzt in Zeile 10 eine Funktion, die heißt operator<< und nimmt einen std::fstream und einen std::string als Argumente entgegen.
Nun gucken wir mal in eine Referenz zum Header fstream:
http://www.cplusplus.com/reference/fstream/
Da sind schon einmal keine Funktionen die dazu passen deklariert, sondern bloß ein paar Klassen. Aber vielleicht ist es ein Member von der Klasse std::fstream. Kann schließlich sein, da g ein std::fstream ist. Gucken wir da:
http://www.cplusplus.com/reference/fstream/fstream/
Ok, da gibt es einen operator<<, mal genauer gucken:
http://www.cplusplus.com/reference/ostream/ostream/operator<</
Hmm, jede Menge mögliche Argumente, aber weit und breit kein std::string. Da std::string eine eigene Klasse ist, die nix mit den Streams zu tun hat, liegt es nahe mal dort zu gucken. Es kann kein Member von std::string sein, weil dann der Aufruf verkehrt herum wäre (dann müsste esgruss << g;
lauten), also muss es eine frei Funktion sein. Gucken wir mal im Header string:
http://www.cplusplus.com/reference/string/
* Bah! Die haben die Referenz geändert! Das macht mir mein schönes pädagogisches Beispiel kaputt!*
Früher stand hier die passende Funktion. Nun muss man bei der Klasse std::string direkt gucken:
http://www.cplusplus.com/reference/string/string/
Ist vielleicht auch besser so (von der Organisation der Referenz her), denn dann muss man nicht groß nachdenken wie oben beschrieben, sondern kann gleich an den in Frage kommenden Stellen (std::fstream, std::string) gucken.
Jedenfalls sehen wir unten unter non-member functions:
http://www.cplusplus.com/reference/string/string/operator<</
Bingo!
Ein fstream ist bekanntlich auch ein ostream (ansonsten kann man es nachgucken, siehe oben), die Argumente passen also. Dies ist die Funktion, die benutzt werden soll. Und wo wird sie deklariert?
Reference -> <string> -> string -> operator<<
Also im Header string.Das ganze ist nun unnötig kompliziert dargestellt, eigentlich hättest du auch viel direkter sehen können, das der Header string fehlt, da du std::string benutzt. Das wird nämlich naheliegenderweise auch im Header string deklariert.
-
Danke SeppJ und out und allen anderen.