ofstream-Array per Schleife deklarieren, öffnen und verwenden



  • Hallo zusammen,

    ich möchte in einem Programm mehrere txt-Dateien öffnen und in diese hineinschreiben. Dazu habe ich erstmal einen ofstream-Array deklariert:

    std::ofstream plot[10];
    

    Aus diesem Array wollte ich nun jedes einzelne Feld öffnen:

    for(int i = 0; i < 10; i++)     {
        plot[i].open("Plot%i.txt", i);
        plot[i].precision(15);
    }
    

    später verwenden:

    plot[i] << ... << ...;
    

    und schließen:

    for(int i = 0; i < 10; i++)     {
            plot[i].close();
    }
    

    Hatte mir schon gedacht dass das Öffnen nicht funktioniert, aber wie sonst?

    Der Fehler hieß:
    "error: invalid conversion from 'int' to std::ios_base::openmode"


  • Mod

    open ist nicht printf*.

    plot[i].open("Plot" + to_string(i) + ".txt");
    

    *: Und Programmieren ist nicht Ausprobieren. Ist verlockend, aber funktioniert nicht. Das dieser spezielle Fall ebenfalls nicht funktioniert, hättest du leicht mit einer Referenz zu open heraus finden können.


  • Mod

    ich möchte in einem Programm mehrere txt-Dateien öffnen und in diese hineinschreiben.

    Dann schreibe eine Schleife in der du in jedem Schleifendurchlauf einen ofstream erzeugst, initialisierst und in ihn die entsprechenden Daten schreibst. (Schließen ist nicht nötig, dass macht der Destruktor am Ende jedes Schleifendurchlaufs automatisch).



  • Danke für die schnelle Antwort! "to_string was not declared in this scope" brauch ich da noch eine andere Bibliothek via #include? Wie macht man hier Absätze?



  • An Arcoth: Das löst das Problem der Namensgebung nicht 😉


  • Mod

    ihaveaquestion schrieb:

    An Arcoth: Das löst das Problem der Namensgebung nicht 😉

    std::ostringstream stream;
    stream << "Plot" << i << ".txt";
    plot[i].open( stream.str().c_str() ); // Seit C++11 kannste das .c_str() weglassen
    


  • Habe es jetzt so gemacht wie in deinem Code, mit Deklaration in der Schleife:

    for(int j = 0; j < 10; j++)             {
        std::ostringstream stream;
        stream << "Plot" << j << ".txt";
        plot[j].open( stream.str() ); // Seit C++11 kannste das .c_str() weglassen
        plot.precision(15);
    ...
        plot[j] << i << "   \t" << x << "   \t" << y << "   \t" << v << "   \t" << u << "   \n";
    ...
        plot[j].close();
    

    Ich bekomme folgende Fehlermeldung: "error: aggregate 'std::ostringstream stream' has incomplete type and cannot be defined"



  • Ich denke ich habe verstanden was passiert:

    std::ofstream plot;
        std::ostringstream stream;
        stream << "Plot" << j << ".txt";
        plot.open( stream.str().c_str() );
        plot.precision(15);
    

    die Variable stream ist ein String und der wird zum öffnen benutzt, richtig? UND FUNKTIONIERT!! Danke! 🙂


  • Mod

    ihaveaquestion schrieb:

    Danke für die schnelle Antwort! "to_string was not declared in this scope" brauch ich da noch eine andere Bibliothek via #include? Wie macht man hier Absätze?

    string brauchst du. Und es ist im namespace std. Und C++11 brauchst du, was aber seit ungefähr 3 Jahren Standard sein sollte 😉 . Du musst es wahrscheinlich nur aktivieren.

    ihaveaquestion schrieb:

    die Variable stream ist ein String und der wird zum öffnen benutzt, richtig?

    Nein, es ist ein Stream 🙂 . Einer, der intern einen string als Puffer benutzt. Damit bastelst du dir hier einen passenden String für den Dateinamen.

    Das ganze ist die urtümliche und etwas umständliche Art und Weise, Strings in C++ zu basteln. Du verstehst bei einem Vergleich zu meinem Vorschlag sicherlich, wieso man to_string eingeführt hat.


Anmelden zum Antworten