Daten in einer .txt o. ä. speichern und aufrufen!
-
Hallo liebe Community.
Ich beschäftige mich erst seit kurzem mit C++.Heute habe ich es geschafft ein kleinen Mini-Vokabeltrainer zu schreiben und weiß nun ein bisschen wie man Strings/Variabeln benutzen kann.
Also weitere Übung möchte ich nun versuchen ein kleines Adressbuch zu schreiben (Bitte nicht gleich ein kompletten Code hier poste, soll ne Übung für mich sein
)Meine Frage ist nun:
Wenn ich ganz normal mit String Daten eingebe und sie auch wiedergeben lasse, kann ich diese auch in einer .txt speichern?
Also wenn ich jetzt z.b. mein Minivokabeltrainer (http://iiinet.ii.funpic.de/vokabeltrainer.exe) öffne, kann ich Daten eingeben und die werden anschließend im Programm irgendwann wiedergegeben. Aber wenn ich das Programm schließe und anschließend wieder öffne, sind die Daten ja wieder weg . (Ganz logisch eigentlich)
Wie speicher ich diese Daten?Lg euer Zut
-
Die C++-Standardbibliothek bietet die Streams zur Ein- und Ausgabe von Daten. Dazu gehört auch
std::fstream, mit dem man in Dateien schreiben und von ihnen lesen kann. Die Handhabung ist praktisch gleich wie beistd::coutbzw.std::cin.Beispiel für Ausgabe in Datei:
std::ofstream Stream("datei.txt"); // entweder direkt über den Konstruktor Stream.open("datei.txt"); // oder nachträglich öffnen Stream << "Eintrag in Textdatei: " << 3 << std::endl;Beispiel für Eingabe von Datei:
std::ifstream Stream("datei.txt"); int Var; Stream >> Var; // liest einen einzelnen Eintrag (durch Whitespace getrennt) std::string Str; std::getline(Stream, Str); // liest eine gesamte Zeile und speichert sie im String Str.Hier findest du eine Referenz zur Klasse
fstream, bei Google gibts sehrwahrscheinlich einige Tutorials dazu.
-
Da wäre das Thema streams angesagt. Vor allem File Streams.
Streams:
http://www.cplusplus.com/reference/iostream/ifstream: (einlesen)
http://www.cplusplus.com/reference/iostream/ifstream/ofstream: (schreiben)
http://www.cplusplus.com/reference/iostream/ofstream/Ich weiss nicht, ob dir die Referenz wirklich zusagt, aber ich würde eher ein Buch empfehlen. (Wenn du eins hast, wird das bestimmt noch behandelt).
-
Danke für die schnellen Antworten.
Nexus, muss ich die datei.txt selber anlegen oder macht es die .exe selber?
Würde mich über ein komplettes Mini-Beispiel freuen ^^ Also ein String der was in die Textdatei speichert und ein String der didese Datei denn wieder aufruft.
Habe mir auch die Links mal schnell angeguckt (morgen nachdem ich ausgeschlafen bin, schau ich mir das nochmal ausführlicher an^^) und muss sagen, dass ich auf den ersten Blick nicht viel damit anfangen kann. Liegt viell. daran, dass sie komplett auf englisch ist und da der ein oder andere Tag dazwischen ist, mit den ich noch nichts anzufangen weiss.
Deshalb würde ich mich über ein ausführliches Beispiel sehr freuen.Gegoogelt habe ich auch schon fleißig und auch das ein oder andere gefunden. Aber ich dachte ich melde mich hier trotzdem an und frag das ein oder andere lieber nochmal nach.

Mfg
-
Zut schrieb:
Nexus, muss ich die datei.txt selber anlegen oder macht es die .exe selber?
Würde mich über ein komplettes Mini-Beispiel freuen ^^ Also ein String der was in die Textdatei speichert und ein String der didese Datei denn wieder aufruft.
Wenn die Datei noch nicht besteht und du sie zum schreiben öffnest, wird sie erstellt.
Nexus hat ja schon ein Beispiel gepostet. Mehr macht imo auch keinen Sinn. Da liest du lieber ein gutes Tutorial durch und/oder schaust in der Referenz nach.
-
Hmm hab nun dieses Code verwendet aber irgendwie ist der Compiler damit nicht einverstanden:
#include <iostream> #include <string> using namespace std; int main () { std::ofstream Stream("datei.txt"); // entweder direkt über den Konstruktor Stream.open("datei.txt"); // oder nachträglich öffnen Stream << "Eintrag in Textdatei: " << 3 << std::endl; }
-
du musst noch die Datei <fstream> inkludieren
-
Danke.
Die Textdatei legt er zwar nun an aber er beschreibt sie nicht.

-
#include <iostream> #include <string> using namespace std; int main () { std::ofstream Stream("datei.txt"); Stream << "Eintrag in Textdatei: " << 3 << std::endl; }
-
Danke hat soweit alles funktioniert.
Hier mein aktueller Code:#include <iostream> #include <string> #include <fstream> using namespace std; int main () { string testi; cout << "Eintrag: \t"; std::getline(cin, testi); cout << "Es wurde folgendes in die Datei eingetragen: \n \n"; cout << testi; std::ofstream Stream("datei.txt"); Stream << "Eintrag in Textdatei: " << testi << std::endl; cin.get(); }Wenn ich die Anwendung neu öffne und wieder was reinschreibe, überschreibt er die Textdatei mit dem neuen Inhalt.
Ist es auch möglich, dass er die neuen Einträge einfach unter die Alten speichern???
-
std::ofstream Stream("datei.txt", std::ios::app);http://www.cplusplus.com/reference/iostream/ofstream/ofstream.html
-
Danke hat schon wieder geklappt

Aber nun gibt es leider noch beim anschließenden Auslesen Probleme:
#include <iostream> #include <string> #include <fstream> using namespace std; int main () { string testi; cout << "Eintrag: \t"; std::getline(cin, testi); cout << "Es wurde folgendes in die Datei eingetragen: \n \n"; cout << testi; std::ofstream Stream("datei.txt", std::ios::app); Stream << "Eintrag in Textdatei: " << testi << std::endl; cout << "Bisherige Eintr\204ge: \n"; std::ifstream Stream("datei.txt"); int Var; Stream >> Var; // liest einen einzelnen Eintrag (durch Whitespace getrennt) std::string Str; std::getline(Stream, Str); // liest eine gesamte Zeile und speichert sie im String Str. cin.get(); }
-
Das nächste mal bitte noch mit der Beschreibung, was nicht geht.
Du darfst natürlich nicht 2 mal den gleichen Bezeichner benutzen.
Und den stream musst du zuerst schliessen, bevor du mit der Datei weiterarbeiten solltest.#include <iostream> #include <string> #include <fstream> using namespace std; int main () { string testi; cout << "Eintrag: \t"; std::getline(cin, testi); cout << "Es wurde folgendes in die Datei eingetragen: \n \n"; cout << testi; std::ofstream Stream("datei.txt", std::ios::app); Stream << "Eintrag in Textdatei: " << testi << std::endl; cout << "Bisherige Eintr\204ge: \n"; Stream.close(); std::ifstream in("datei.txt"); //sowieso anderer Name int Var; in >> Var; std::string Str; std::getline(Stream, Str); cin.get(); }So sollte das gehen, aber du solltest dich noch einmal ein wenig mit den Grundlagen befassen. (doppelte Deklaration und so).
Ausserdem weiss ich nicht genau, wie du dir den Aufbau der Datei vorstellst und somit müsstest du schon sagen,was das ganze machen soll. Im Moment wird ein Integer am Anfang eingelesen und dann eine Zeile. Ich vermute, dass das nicht ganz das ist, was du willst. (merke, dass ein stream, wenn du ihn erstellst immer am Anfang anfängt.)
-
So habe es einigermaßen hinbekommen bzw. den Code nochmal neu und sauberer geschrieben:
#include <iostream> #include <string> #include <fstream> using namespace std; int main() { string testi; cout << "Eintrag: \t"; getline(cin, testi); fstream f; f.open("test.dat", ios::out); f << testi; f.close(); string s; f.open("test.dat", ios::in); getline(f, s); // Lese eine Zeile cout << s << endl; // Zeige sie auf dem Bildschirm cin.get(); }Das klappt soweit ABER sobald ich den Dateimodus von "ios::out" auf "ios::app" ändere, damit ich mehrere Eingaben speichern und auslesen kann und nicht nur eine, geht es nicht !!!!

Warum?
-
Keiner eine Idee?
-
Sag einmal, was nicht geht.
Ich vermute mal, dass dir einfach das out fehlt..f.open("test.dat", ios::out | ios::app );//Ausgabe UND append
-
drakon schrieb:
Sag einmal, was nicht geht.
Ich vermute mal, dass dir einfach das out fehlt..f.open("test.dat", ios::out | ios::app );//Ausgabe UND appendDanke, dass geht soweit aber nun speichert er alle Einträge genau nebeneinander und nicht mehr untereinander
-
Zut schrieb:
Danke, dass geht soweit aber nun speichert er alle Einträge genau nebeneinander und nicht mehr untereinander
dann scvhreib dir umbrüche auch in die datei.
f << testi << '\n';
-
volkard schrieb:
Zut schrieb:
Danke, dass geht soweit aber nun speichert er alle Einträge genau nebeneinander und nicht mehr untereinander
dann scvhreib dir umbrüche auch in die datei.
f << testi << '\n';Danke!
Aber nun liest er ja nur die Zeile
Wie kann ich dem sagen, dass er alle Einträge (auch mehrere Zeilen) wiedergeben soll
-
Zut schrieb:
Aber nun liest er ja nur die Zeile
Wie kann ich dem sagen, dass er alle Einträge (auch mehrere Zeilen) wiedergeben solldas ging glaub ich so:
string s; f.open("test.dat", ios::in); while(getline(f, s)) // Lies eine Zeile { cout << s << endl; // Zeige sie auf dem Bildschirm }