Wie kann ich in C++ Daten langfristig speichern? Also zum Beispiel einen Punktestand der nach dem Neustart des Programms erhalten bleiben soll?

8 Antworten

Suche mal in deinem Lieblingsbuch / -tutorial nach dem Thema "Datei Ein- und Ausgabe" bzw. auf Englisch nach "File IO".

In C++ benutzt man dafür die Streamklassen ifstream oder ofstream, bzw. einfach das, was du in <fstream> findest:

http://www.cplusplus.com/reference/fstream/fstream/fstream/

Für textuelle Ausgaben ist das sehr gut geeignet, binär ist - wie immer - plattformabhängig, aber geht auch leicht.

Alternativ kannst du auch die "alte" C-API wie in der Antwort von Isendrak nehmen, aber das kann man dann kaum noch C++ nennen.

Trotzdem haben die richtigen C++ Streams auch große Probleme, denn ein Äquivalent zum altbekannten ftruncate() gibt es z. B. nicht.

Auf die Schnelle hingepfriemelt:
#include <fstream>
#include <iostream>
#include <map>
#include <ostream>
#include <string>

using data_key = std::string;
using data_value = int;

using data_store = std::map<data_key, data_value>;

void dump_data(const data_store& store, std::ostream& os=std::cout) {
for (auto& pair : store) {
os << pair.first << ' ' << pair.second << std::endl;
}
}

data_store load_data(const std::string& file_name) {
data_store store;
std::ifstream ifs{file_name};

data_key key{};
data_value value{};
while (ifs.good()) {
ifs >> key >> value;

if (!ifs.bad()) {
store[key] = value;
}
}

return store;
}

void store_data(const std::string& file_name, const data_store& store) {
std::ofstream ofs{file_name};

dump_data(store, ofs);
}

int main() {
using namespace std;

auto store = load_data("data-in.txt");

data_value alpha = store.at("alpha");
cout << "alpha read from store -> " << alpha << endl;

store["beta"] = 0;
store["delta"] = 123456;
store_data("data-out.txt", store);

cout << endl << store.size() << " elements in store:" << endl;
dump_data(store);
}

Wenn du also eine Datei "data-in.txt" mit folgendem Inhalt hast:

alpha 123
beta 456
gamma 789

Dann gibt es folgende Ausgabe:

alpha read from store -> 123

4 elements in store:
alpha 123
beta 0
delta 123456
gamma 7890

Und es wird eine Datei "data-out.txt" geschrieben:

alpha 123
beta 0
delta 123456
gamma 7890

Beachte, dass die Schlüssel sortiert werden, da ich eine std::map eingesetzt habe.

Disclaimer: Der Code ist nur halb getestet, weil ich jetzt keinen Compiler zur Hand habe, müsste aber größtenteils laufen! (Hoffentlich keine Vertipper und Logikfehler ...) Normalerweise pfusche ich nicht so, aber ich muss jetzt schnell Abendessen machen und habe keine Zeit mehr, sorry!

Fehlerbehandlung und Exceptionhandling musst du dir selbst bauen, und die Doku der STL hilft bei Unklarheiten weiter.

Falls dich der Code leicht überfordern sollte, fange in main() an Zeile für Zeile zu lesen und hangel dich von dort aus weiter durch.

Viel Spaß! :)

PS: Heute gibt es sogar noch ein Video von Youtube dazu! Was für ein Service, nicht wahr? ;)

https://youtube.com/watch?v=fqR2HGkjFCA


Kieselsaeure  20.04.2017, 06:59

hab mich aufs video gefreut und dann sowas :-(

0
TeeTier  19.04.2017, 22:54

PS: Mist, falsches Video! ><

Naja egal ... keine Zeit mehr. Schönen Abend noch! :)

0

Eine möglichkeit wäre über eine Textdatei. Das die nicht so einfach die runde macht kannst du sie verschlüsseln und systeminfos mit rein packen und abfragen das sie seriell nicht die runde machen kann wie gesagt. Wäre m.M.n ne gute Methode auf den ersten blick


Kieselsaeure  20.04.2017, 06:53

ich finde diese seite für ifstream/ofstream/fstream ganz gut und nutze es gerne als nachschlagewerk: http://www.cplusplus.com/reference/fstream/fstream/ <- siehe ifstream und offstream. vergiss nicht zu prüfen ob datei vorhanden und schreibrechte vorhanden. lass das mit der verschlüsselung dann villeicht am anfang weg wenns dir zu viel ist. ich denke das wird ja eher nen spassprojekt.. da brauchts dann nicht zwingend die sicherheit der konfigurationsdatei. wohin damit? auf der festplatte hast du kaum grenzen! such dir ein schönes Plätzchen raus. falls das prog plattformunabhängig sein soll musst du je nach os evtl den pfad anpassen. bsp windows/linux distri oder bsd. da musst du den pfad anpassen

0
DM6835 
Beitragsersteller
 20.04.2017, 06:45

Und wie kann man in C++ eine Textdatei machen? Und wo soll ich sie dann abspeichern?

0

Daten werden in einer Datei oder Datenbank gespeichert.

Wenn Du in C++ programmierst, müsstest Du das eigentlich wissen, ansonsten entspr. Tutorials im Internet suchen oder Fachliteratur lesen.

Hier wirst Du keine Antwort für ein komplexes Programmiervorhaben bekommen, das sprengt den Rahmen hier.

Woher ich das weiß:Berufserfahrung – Langjährige Erfahrung als IT-Systemtechniker

Vielleicht in ner Config abspeichern? oder XML


DM6835 
Beitragsersteller
 19.04.2017, 20:53

Und wie genau?

0
DennisReallife  19.04.2017, 20:56
@DM6835

Kann ich dir leider nicht sagen, arbeite mit Java, C#, Google einfach mal ^^

0