ofstream als Funktionsparameter



  • Hallo,

    ich möchte in einer Funktion, sagen wir F1, in einen ofstream schreiben.
    Der ofstream soll aber nicht fest sein, sondern irgendwie als Argument von der rufenden Funktion übergeben werden, da die Ausgabe mal in dem einen File (assoziert mit einem ofstream), mal in einem anderen File (assoziiert mit einem anderen ofstream) erfolgen soll.
    Ich hab irgendwie mit * und & rumhantiert, aber hat alles nicht wirklich funktioniert, ich versteh einfach nicht, wie das gehen kann.
    Kann mir jemand helfen und sagen, wie F1 und die rufende Funktion aussehen müssen? Vielen Dank!



  • Was funktioniert denn nicht? Fehlermeldungen? Code?



  • Hallo,

    ich hab da zuletzt wirklich nur rumgepfuscht, glaube nicht, daß das hilfreich ist wiederzugeben.
    Letzte Version sah so aus:

    ofstream result_file("Results\\results.txt", ios_base::app);
    
    //rufende Funktion:
    ...
    writeParameters(*result_file);
    ...
    
    void Statistics::writeParameters(ofstream& outputfile_ptr) {
         ofstream* test_ptr=&outputfile_ptr;
         ofstream test=*test_ptr;
         test << "test";
    

    Fehlermeldung:

    E2247 Zugriff auf 'ios::basic_ios(const ios &)' nicht möglich (Zeile 10)
    E2125 Compiler konnte Konstruktor kopieren nicht für die Klasse 'ostream' generieren (Zeile 10)
    E2109 kein zulässiger Typ (Zeile 5)
    


  • Wie einfacher:

    ofstream result_file("Results\\results.txt", ios_base::app);
    
    //rufende Funktion:
    ...
    writeParameters(result_file); //nicht *result_file. result_file ist kein pointer und muss daher auch nicht dereferenziert werden
    ...
    
    void Statistics::writeParameters(ostream& writer)  //ostream anstatt waere flexibler. Ausserdem ist es eine Referenz. Mit Pointern muss nicht gebastelt werden
    {
         writer << "test";
    }
    


  • susie schrieb:

    Ich hab irgendwie mit * und & rumhantiert, aber hat alles nicht wirklich funktioniert, ich versteh einfach nicht, wie das gehen kann.

    Das klingt danach als solltest du dich noch einmal eingehender mit Referenzen und evtl. auch mit Zeigern beschäftigen. "Irgendwie rumhantieren" ohne echtes Verständnis führt meist zu nichts.



  • Ja, danke, jetzt klappts 🙂

    Daß meine vorige Version Murks war, weiß ich, hab ich von wonaders kopiert, wo das funktioniert hat (war aber mit GUI-Klassen, von daher war das mit den Pointern vielleicht anders)

    Meine Version davor war diese:

    //rufende Funktion:
    ...
    writeParameters(&result_file);
    ...
    
    void Statistics::writeParameters(ofstream* outputfile_ptr) {
    ofstream test=(ofstream)*outputfile_ptr;
    test << "test";
    }
    

    Fehlermeldungen hier waren E2247 und E2125 in der ersten ZEile von writeParameters.

    Und das hab ich nicht verstanden, warum...
    Wenn jemand noch was dazu sagen würde, wärs nett (vielleicht kapier ichs dann endlich mal), aber Hauptsache ist, daß es jetzt klappt!



  • susie schrieb:

    //rufende Funktion:
    void Statistics::writeParameters(ofstream* outputfile_ptr) 
    {
       ofstream test= (ofstream)*outputfile_ptr; //hier versuchst Du, den Stream zu kopieren. Streams koennen aber nicht kopiert werden
    test << "test";
    }
    

    Du versuchst eine Kopie des Streams zu erstellen. Das geht aber nicht.



  • susie schrieb:

    Fehlermeldungen hier waren E2247 und E2125 in der ersten ZEile von writeParameters.

    Und das hab ich nicht verstanden, warum...
    Wenn jemand noch was dazu sagen würde, wärs nett (vielleicht kapier ichs dann endlich mal), aber Hauptsache ist, daß es jetzt klappt!

    Wenn du uns jetzt noch sagst was E2247 und E2125 für Fehlermeldungen haben? Fehler sind nicht standardisiert und nicht jeder benutzt den gleichen Compiler. Was du dort gemacht hast sieht aus als hättest du geraten wie es vielleicht funktionieren könnte. ofstreams kann man nicht einfach kopieren. Davon abgesehen ist der C-Cast fehl am Platze.



  • @pumuckl:
    Als ich sowas das letzte Mal gebraucht habe in meinem Programm, das war vor ca. 2 Jahren (das Programm ist für mich nur Mittel zum Zweck). Da hab ich mir das eingehender angesehen und irgendwie hingekriegt (aber so richtig gut verstanden hab ich es trotzdem nicht (kannte auch dieses Forum noch nicht). Aber gut, wenn ich es so selten brauche...) Ansonsten stimme ich Dir zu, wäre besser, es zu verstehen, daher frage ich jetzt. Nur wenn man die Dinge so selten braucht, bleibts dann auch nicht lange hängen. Insofern ist es gut, es hier bei Bedarf nochmal nachlesen zu können.
    Die Fehlermeldungen hab ich in dem Posting davor beschrieben.

    @Tachyon:
    Ach so, Kopie deswegen, weil ich test als stream deklariert habe, daher wird ein Platzhalter angelegt und bei einer Zuweisung müßte es dann kopiert werden (was aber eben bei streams nicht geht)?! Kann man sich das so vorstellen?

    Danke und viele Grüße



  • Hm, frag mich grade, warum ich es damals so kompliziert fand. Denn so wie jetzt hatte ich es schonmal verstanden, aber das ging damals nicht (keine Ahnung mehr warum)
    Na ja, wie dem auch sei, nur damit ich es richtig verstanden hab:
    1. würde man streams kopieren können, hätte meine letzte VErsion doch funktioniert? (mal abgesehen, daß es vermutlich keinen Sinn macht, sie zu kopieren, weil ich will ja in dasselbe File schreiben)
    2. ist es bei Referenzparametern immer so, daß man sie in der rufenden Funktion nur mit dem Namen übergibt und aber im Header (sorry, weiß nicht mehr, wie der richtige Begriff dafür ist) der aufgerufenen Funktion mit "&" schreibt?
    Und Referenzparameter nimmt man immer dann, wenn keine Kopie angelegt werden soll, sondern die Änderungen im Paramter selbst stattfinden sollen?!



  • susie schrieb:

    1. würde man streams kopieren können, hätte meine letzte VErsion doch funktioniert? (mal abgesehen, daß es vermutlich keinen Sinn macht, sie zu kopieren, weil ich will ja in dasselbe File schreiben)

    Genau. Vor allem könnte es Probleme geben einen Stream in ein schon offenes file zu kopieren.

    2. ist es bei Referenzparametern immer so, daß man sie in der rufenden Funktion nur mit dem Namen übergibt und aber im Header (sorry, weiß nicht mehr, wie der richtige Begriff dafür ist) der aufgerufenen Funktion mit "&" schreibt?
    Und Referenzparameter nimmt man immer dann, wenn keine Kopie angelegt werden soll, sondern die Änderungen im Paramter selbst stattfinden sollen?!

    Referenzparameter haben nur an einer einzigen Stelle im Code das '&', nämlich da wo die Referenz deklariert wird. Übergeben wird der Parameter ohne Schnörkel und benutzt wird die Referenz auch ganz ohne irgendwelche Extras, so als wäre es ein eigenes Objekt.
    Referenzparameter nimmt man dann, wenn 1) keine Kopie angelegt werden soll und 2) das Objekt immer vorhanden sein muss. (ist 2. nicht gegeben nimmt man Pointer)
    Wenn das übergebene Objekt geändert werden soll nimmt man eine normale referenz, wenns nicht geändert werden soll eine const referenz.



  • Danke, ich glaube, jetzt hab ich es verstanden!


Anmelden zum Antworten