in C++ vom programm eine .txt erstellen lassen?

5 Antworten

// Zweck: einfaches Programm Datei schreiben und lesen

// Pfad: dateischrles.cpp

#include <iostream>

#include <fstream>

using namespace std;

int main()

 {

  // Datei schreiben

  ofstream fileout;

  fileout.open("beispiel.txt");

  fileout << "Das steht jetzt in der Datei.";

  fileout.close ();

  // Datei lesen

  string dateizeile;

  ifstream fin;

  fin.open("beispiel.txt");

  getline(fin ,dateizeile);

fin.close ();

cout << "Zeile in der Datei: " << dateizeile << endl;

return 0;

}

linus05 
Fragesteller
 04.05.2020, 18:47

vielen dank aber kann ich auch eine variable in fileout<<"Das steht jetzt in der Datei"; bringen weil das klappt nicht.

0
mrlilienweg  05.05.2020, 06:21
@linus05

Hast du #include <fstream> eingebunden?

ofstream fileout; definiert ofstream,

Das muss funktionieren.

1

Entweder du nimmst dir dafür eine Drittbibliothek, baust dir selber eine schön verpackte Klasse, oder nutzt folgende sehr einfache Implementierung:

#include <filesystem> // path
#include <fstream> // ifstream, ofstream
#include <iostream> // cout
#include <string> // string
#include <tuple> // apply, make_tuple

template <class ... ARGS>
[[nodiscard]] inline auto load(const ::std::filesystem::path & fnam, ARGS && ... args) {
    using namespace ::std;
    static_assert(sizeof...(ARGS), "no args supplied");

    auto result { make_tuple(args ...) };
    
    if (ifstream ifs { fnam }; ifs.good()) {
        ifs.exceptions(ifstream::failbit);
        ifs.setf(ifstream::boolalpha);

        apply([&ifs] (ARGS & ... refs) { (ifs >> ... >> refs); }, result);
    }

    return result;
}

template <class ... ARGS>
inline void store(const ::std::filesystem::path & fnam, ARGS && ... args) {
    using namespace ::std;
    static_assert(sizeof...(ARGS), "no args supplied");
    
    ofstream ofs { fnam };
    ofs.exceptions(ifstream::failbit | ifstream::badbit);
    ofs.setf(ofstream::boolalpha);

    auto printer { [&ofs] (const auto & ref) {
        ofs << ref << endl;
    } };

    (printer(args), ...);
}

int main() {
    using namespace ::std;
    cout.setf(ios_base::boolalpha);

    const string cfg_file { "./config.txt" };

    auto [my_int, my_float, my_bool, my_char] {
        load(cfg_file, 123, 456.789f, true, 'A')
    };

    cout << "[LOADED]" << endl;
    cout << my_int << endl;
    cout << my_float << endl;
    cout << my_bool << endl;
    cout << my_char << endl;
    cout << endl;

    my_int *= 2;
    my_float += 123.456f;
    my_bool = !my_bool;
    my_char = my_char == 'A' ? 'Z' : 'A';

    store(cfg_file, my_int, my_float, my_bool, my_char);

    cout << "[STORED]" << endl;
    cout << my_int << endl;
    cout << my_float << endl;
    cout << my_bool << endl;
    cout << my_char << endl;
    cout << endl;
}

Guck dir in der main()-Funktion an, wie es genutzt wird.

Der Typ wird automatisch von den Initialwerten genutzt, die an load() übergeben werden, sodass man ihn bei den einzelnen Variablen nicht angeben muss.

Beachte bitte, dass du einen C++17-fähigen Compiler nutzen musst, weil der obige Code exzessiv moderne Sprachfeatrues nutzt!

Alles in allem kannst du deine Werte dann beim Programmstart mit ...

auto [a, b] { load("datei.txt", 23, 42.42) };

... laden, und am Ende mit ...

store("datei.txt", a, b);

... speichern. Existiert am Anfang noch keine Datei (oder kann diese nicht geöffnet werden), werden die Variablen stillschweigend mit den angegebenen Werten initialisiert. Ansonsten wird bei Schreib- und Lesefehlern eine Ausnahme geworfen.

Das ist zwar nicht so sicher, wie eine hübsch gekapselte Klasse, weil evtl. Werte vertauscht werden könnten, aber es erfordert dafür nur ein paar Zeilen Code. :)

Woher ich das weiß:Berufserfahrung

Suche mal nach MSDN und dazu einen von:

fopen

fclose

fprintf

fscanf

Das sind alte C Befehle, die du dazu verwenden kannst. Es gibt eleganteres, aber damit würde ich anfangen.

Pilsvergiftung  04.05.2020, 04:28

Es geht um C++! :)

1
Pilsvergiftung  04.05.2020, 07:14
@raven3k

Ich kenne cstdio und es ist dennnoch die gute alte C-API.

Zum Programmieren gehört mehr als blind irgendwelche APIs zu nutzen!

Und wie man es in C++ macht, siehst du in meiner Antwort. Das ist nämlich typsicher, nutzt RAII, uvm. ... Also all das, was es in C nicht gibt.

Leider programmieren viele Leute ohne Not in C++ wie in C. Etwas, wovor in nahezu ALLEN C++ Büchern eindringlich gewarnt wird!

Also: fopen() & Co ist und bleibt C. Und man sollte es in C++ meiden!

0
gogogo  04.05.2020, 09:07
@Pilsvergiftung

Das ist mir völlig klar und habe es, wenn auch indirekt, erwähnt. Deine Lösung ist, denke ich, für den Fragesteller, der noch nichts mit Dateien in C++ zu tun hatte, viel viel zu kompliziert.

Das kann als Steigerung kommen, wenn ein Gefühl für Dateien und Problemen damit bekannt ist.

Es war schon Absicht von mir, auf die C++ äquivalente Möglichkeiten nicht einzugehen, obwohl mir die vertraut sind.

0

Natürlich ist das möglich ;)

LG

Woher ich das weiß:eigene Erfahrung – Mehrere Jahre Erfahrung mit Computern