String in Datei schreiben



  • Hallo liebe Gemeinde,

    ich wollte mich zunächst bei vielen hier bedanken, die mir in den anderen Beiträgen nett geantwortet haben.

    ich wollte nun fragen, wieso folgendes beim Schreiben in eine Datei nicht geht:

    fstream g;
    string Gruss = Hallo;
    
    g << Gruss;
    

    Würde ich

    g << "Hallo";
    

    schreiben würde es gehen. Wieso aber obige Version nicht? Es handelt sich doch auch um einen String.

    Lieben Dank im Voraus,

    Jenny



  • std::string w = "welt";
    std::ofstream out("datei.txt");
    out << "Hallo " << w << std::endl;
    


  • Hi!

    Lies doch Mal die Fehlermeldungen. Beschwert sich der Compiler zuallererst bei g << Gruss oder nicht doch schon vorher?

    Und Du schreibst doch in der funktionierenden Lösung auch nicht:

    g << Hallo;
    

    sondern

    g << "Hallo";
    

    Klingelt's? Schau Dir die Fehlermeldung des Compilers an, bevor Du antwortest.



  • Sorry, es müsste so heissen:

    fstream g;
    string Gruss = "Hallo";
    
    g << Gruss;
    

    Habe statt "Hallo" Hallo geschrieben. Gruss enthält nun "Hallo". Wieso kann Gruss nicht in g rein?



  • jenny.caros schrieb:

    Wieso kann Gruss nicht in g rein?

    Ah, ja, ich seh was du meinst. g weiß leider nicht, wohin er schreiben soll. Das müsstest du ihm noch sagen.



  • Was heißt "nicht geht" und "gehen" in Deiner Frage? Drücke Dich bitte präziser aus.

    jenny.caros schrieb:

    fstream g;
    string Gruss = Hallo;
     
    g << Gruss;
    

    Das hier produziert sicherlich eine Fehlermeldung zur Übersetzungszeit. Welche ist das und was genau verstehst du bei dieser Fehlermeldung nicht? Dir ist schon klar, dass der Text der Fehlermeldung nicht nur zum Spaß ausgegeben wird, oder? Der Text in ein Hinweis für Dich, mit dem Du Dir Deine Frage leichter selbst beantworten können solltest.



  • 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?


  • Mod

    #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.


  • Mod

    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 es gruss << 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. 🙂


Anmelden zum Antworten