fstream an Funktion übergeben.



  • Hallo zusammen,

    ich möchte in einem Programm eine große txt mit Werten erstellen, in die jedes Unterprogramm auch reinschreiben kann. Ich kenne und nutze den filestream "fstream".

    Beim kompilieren ruft mein Compiler "ios_base.h" auf.
    Wieso funktioniert das nicht?
    Hier der Code:

    #include<iostream>
    #include<stdio.h>
    #include<math.h>
    #include<fstream>
    
    using namespace std;
    
    double plotf(double x, double r, fstream plot);
    
    int main ()  {
    
        fstream plot;
        plot.open("Plot.txt", ios::out);
        plotf(0.4, 2.8, plot);
        plot.close();
    
        return 0;
    
    }
    
    double plotf(double x, double r, fstream plot)      {
    
        for(int i = 0; i < 1000; i++)       {
            x = r*x*(1-x);
            if(i > 200)     {
                plot << r << "/t" << x;
                //printf("%e \t %e \n", r, x);
            }
        }
        return 0;
    }
    


  • Ich glaube kaum, dass du den fstream kopieren willst (was du beim funktionsaufruf tust.)
    (EDIT: soll heißen: das geht gar nicht. Die Fehlermeldung "use of deleted function" bedeutet, dass hier etwas explizit verboten wurde. In diesem Fall das kopieren)

    double plotf(double x, double r, fstream& plot);
    

    2. wenn du nur in die Datei schreiben willst verwende besser: ofstream
    Dadurch wird Zeile 12 & 13 zu:

    ofstream plot("Plot.txt");
    

    viel schöner, nicht?

    (Dann muss natürlich auch die Funktion einen ofstream nehmen)

    EDIT: \t nicht /t und vielleicht noch ein \n spendieren. 😉



  • Erstmal vielen Dank für die schnelle und nette Antwort!

    Hab denke ich alles so gemacht wie du gesagt hast, bekomme nun aber folgende Fehlermeldung:
    error: redeclaration of 'std::ofstream plot'
    Als fehlerhafte Zeile gibt er 'ofstream plot ("...");' aus und sagt, eine Zeile darüber sei ofstream bereits deklariert worden?

    #include<iostream>
    #include<stdio.h>
    #include<math.h>
    #include<fstream>
    
    using namespace std;
    
    double plotf(double x, double r, ofstream& plot);
    
    int main ()  {
    
        ofstream plot;
        ofstream plot("Plot.txt");
        plotf(0.4, 2.8, plot);
    
        return 0;
    
    }
    
    double plotf(double x, double r, ofstream& plot)      {
    
        for(int i = 0; i < 1000; i++)       {
            x = r*x*(1-x);
            if(i > 200)     {
                plot << r << "\t" << x << "\n";
                //printf("%e \t %e \n", r, x);
            }
        }
        return 0;
    }
    


  • plot.open("...");
    

    wäre korrekt gewesen 😉

    Funktioniert!! DANKE!!


  • Mod

    ihaveaquestion schrieb:

    Als fehlerhafte Zeile gibt er 'ofstream plot ("...");' aus und sagt, eine Zeile darüber sei ofstream bereits deklariert worden?

    Ist ja auch so. Also mach die Zeile darüber weg.

    Tipp: Mach nicht einfach alles nach, ohne es zu verstehen. Dir ist offenbar nicht klar, was deine Zeile 13 bedeutet. Wobei es für dich wohl leider noch schwierig ist, dir irgendetwas selber beizubringen, was du nicht verstehst, da du noch ganz am Anfang von C++ stehst. So etwas wie die Zeile 13 kann man jedenfalls nicht googeln, ohne schon zu wissen, was das ist, da das einfach Grundlagenwissen ist.
    Also Einschränkung des Tipps: Mach vorerst nach, was dir gezeigt wird, mit gesunder Vorsicht. Und nimm dir dazu noch vor, möglichst schnell alle Grundlagen zu lernen, damit du im Nachhinein verstehst, was da los ist. Und wenn dir etwas gezeigt wird, dann mach es auch genau nach. Tim06TR hat schließlich gesagt:

    Tim06TR schrieb:

    Dadurch wird Zeile 12 & 13 zu:

    ofstream plot("Plot.txt");
    

    und nicht

    Tim06TR schrieb:

    Dadurch wird Zeile 12 & 13 zu:

    ofstream plot;
    ofstream plot("Plot.txt");
    

    ihaveaquestion schrieb:

    plot.open("...");
    

    wäre korrekt gewesen 😉

    Funktioniert!! DANKE!!

    Das ist eher eine Verschlimmbesserung, aber kann man so machen, wenn man dann besser versteht, was da los ist.



  • Ich denke ich habe das Grundprinzip schon verstanden, habe nur nicht nachgedacht und so nicht gemerkt dass mit der neuen Zeile gleichzeitig deklariert und quasi initialisiert (kann man das hier noch so nennen?) wird.

    Ich habe den kompletten Code verstanden, einfach abtippen ist nicht mein Ding 😉


  • Mod

    ihaveaquestion schrieb:

    Ich denke ich habe das Grundprinzip schon verstanden, habe nur nicht nachgedacht und so nicht gemerkt dass mit der neuen Zeile gleichzeitig deklariert und quasi initialisiert (kann man das hier noch so nennen?) wird.

    Ja. Das neue Objekt wird gleich mit den richtigen Parametern erstellt.

    Ich habe den kompletten Code verstanden, einfach abtippen ist nicht mein Ding 😉

    Gut so, weitermachen. 👍


Anmelden zum Antworten