String aus Datei lesen
-
Guten Tag,
Ich möchte einen String, den ich zuvor mit fprintf in eine datei geschreiben habe wieder auslesen und mit cout ausgeben lassen.
Meine Lösung:
#include <iostream> #include <string> #define MAXE 200 using namespace std; int main() { string satz, ausgabe[MAXE] ; char monat ; FILE *datei_ptr ; cout << "Bitte Satz eingeben: \n" ; while(satz.empty()) getline (cin, satz); cout << "\n Der Satz war: " << satz <<"\n\n" ; cout << "Beginn der Dateidings.\n" ; datei_ptr = fopen("abc.txt", "w"); if (datei_ptr != NULL) { fprintf(datei_ptr, "test"); fgets (ausgabe, MAXE, datei_ptr); fclose (datei_ptr) ; } return 0 ; }
funktioniert nicht:
Fehler: »std::string*« kann nicht nach »char*« für Argument »1« nach »char* fgets(char*, int, FILE*)« umgewandelt werden
Was sollte ich statt fgets verwenden?
-
Vergiss die ganzen C Dateioperationen. Wenn du mit Klassen arbeiten willst (oder auch ganz allgemein), nimm die C++ Dateistreams. Die haben dann schönerweise schon passende Operatoren für gängige Klassen wie std::string überladen. Und falls du nicht weißt, wonach du suchen sollst, gebe ich noch ein paar Stichwörter: fstream, ifstream, ofstream.
Außerdem: Ein Array von strings? Ich glaube nicht, dass du das willst.
-
Hallo,
Vielen Dank für den Hinweis.
Allerdings habe ich nun ein neues Problem:
#include <iostream> #include <string> #include <fstream> #define MAXE 200 using namespace std; int main() { string satz, s ; char monat ; fstream f ; cout << "Bitte Satz eingeben: \n" ; while(satz.empty()) getline (cin, satz); cout << "\n Der Satz war: " << satz <<"\n\n" ; cout << "Beginn der Dateidings.\n" ; f.open("abc.txt", ios::in | ios::out | ios::app) ; while (!f.eof()) // Solange noch Daten vorliegen { getline(f, s); // Lese eine Zeile cout << s << endl; // Zeige sie auf dem Bildschirm f <<"foo" ; } f.close() ; return 0 ; }
Die Anweisung f <<"foo"; wird einfach übersprungen.
Setze ich sie while Schleife, wird die f << "foo" zwar ausgeführt, aber dafür wird alles danach übersprungen.
Wie kann ich in einem Schritt etwas neues in eine Datei schreiben und sie auslesen?
-
Deine Operationen werden schon durchgeführt, jedoch:
- while(!f.eof()) ist keine sehr gute Möglichkeit auf ein Dateiende zu prüfen.
- Du musst beachten, wo der Lesepointer und der Schreibpointer hinzeigen. Diese zeigen an die Position, wo die nächste Lese-/Schreiboperation durchgeführt werden soll.
- Wenn eine Lese- oder Schreibaktion schiefgeht (z.B. weil du dein getline auf eine leere Datei anwendest) wird daraufhin das failbit gesetzt. Dieses verhindert vorerst weiteres Lesen und Schreiben, bis die Situation geklärt wurde.
Deine Probleme sind auf ein Zusammenwirken dieser drei Punkte zurückzuführen. Ich kann dir später mal ein Beispiel zeigen, wie man das richtig machen kann, jedoch will ich zuerst mal wissen: Was soll das überhaupt werden? Reine Übung?
-
Richtig. Reine Übung. Ich versuche mich seit 24 Stunden an c++ und möchte in erster Linie erfahren wie ich mit Strings und Dateien umgehen soll.
Über das Beispiel würde ich mich sehr freuen, vielen Dank schonmal.
-
Da hast du dir aber eine Menge vorgenommen, für 24 h C++. In der Praxis hat man es fast nur mit streams zu tun, die rein lesend oder rein schreibend verwendet werden. Beides gleichzeitig verkompliziert die Sache nur. Ich selber habe gerade festgestellt, dass der Schreib- und Lesezeiger offenbar identisch sind, im Gegensatz zu dem, was ich bisher angenommen habe. Ich hab's nur noch nie gemerkt, weil ich es noch nie benutzt habe.
trotzdem ist hier eine kleine Demo der Sachen, die du in deinem Programm ausprobiert hast. Zusätzlich habe ich auch mal binäres Lesen demonstriert, weil fast alle Anfänger nach kurzer Zeit hier im Forum danach fragen:
#include<iostream> #include<fstream> using namespace std; int main() { fstream file; file.open("abc.txt", ios::in | ios::out | ios::trunc); // Datei öffnen. Trunc sorgt dafür, dass die Datei leer ist, so dass dieses Beispiel immer funktioniert. // Der Lese-/Schreibpointer zeigt jetzt auf den Anfang // Schreibe ein bisschen was in die Datei file << "Hello World!" << endl; // Der Dateipointer zeigt jetzt hinter den obigen Text. Da die Datei leer war, ist das auch gleichzeitig das Ende cout << file.tellp()<<endl; // 13 // Der Lese und der Schreibpointer sind nicht unabhängig voneinander: cout << file.tellg()<<endl; // 13 // Lese nun aus der Datei. Es wird getline verwendet um komfortabel eine ganze Zeile zu lesen. Zuerst muss aber der Dateipointer wieder auf den Anfang gesetzt werden: file.seekg(0); string foo; getline(file,foo); // Gebe das Ergebnis aus: cout << foo << endl; // Hello World! // Schließe die Datei file.close(); // Nun noch eine Demonstration, wie man feststellt, ob noch Daten vorliegen. // Öffne nochmals die Datei diesesmal nur zum Lesen und im Binärmodus, mit dem man unformatiert lesen kann (das heißt, ohne Whitespace automatisch zu überspringen) file.open("abc.txt", ios::in | ios::binary); // Eigentlich könnte und sollte man zum lesen gleich einen ifstream nehmen char bar; while(file.get(bar)) // Solange noch Daten vorliegen { cout << bar; // gebe diese aus // Gibt "Hello World!" aus, inklusive abschließendem newline } } // file wird automatisch geschlossen, wenn wir den Scope verlassen, wozu auch das Programmende zählt.
-
Herzlichen Dank, besser hätte man es sich ja nicht wünschen können.
Die 24h sind ja keine Vorgabe, Zeit ist genug vorhanden.