Memo nicht mit SaveToFile speichern
-
#include <stdio.h> FILE *fp; fp = fopen("file.txt", "wb"); for(int i=0; i<Memo1->Lines->Count; i++) { fputs(Memo1->Lines->Strings[i],fp); } fclose(fp);gruß FB

-
Sorry, so meine ich natürlich:
fputs(Memo1->Lines->Strings[i].c_str(),fp);gruß Fredi

-
Hallo Fredi,
Danke für die Info. Ja, so mache ich es ja auch in Delphi. Werde es morgen (heute!) gleich ausprobieren. Sag mir bitte noch, wie ich die Daten wieder einlese.
Berichte dann, ob es geklappt hat.
Gruß Egbert
-
@FB_ Wir sind hier eigentlich in C++.
Da macht man z.Bsp. so was#include <fstream> using namespace std; ofstream out("File.txt"); for(int i=0; i<Memo1->Lines->Count; i++) { out << Memo1->Lines->Strings[i].c_str() << endl; } out.close();
-
Hallo,
ich denke mal, daß beide Routinen sich gleichen. Die von FB ist in C und deine in C++. Hätte dazu noch einige Fragen, um das Ganze besser zu verstehen.
was bedeutet:1. "using namespace std;" 2. "endl" am Ende von "out << Memo1->Lines->Strings[i].c_str() << endl;"Vermute, daß "endl" die Anweisung für einen Zeilenumbruch ist.
3.Wie gehe ich nun vor, um die Daten wieder einzulesen.
Danke dir schon jetzt für deine Antwort. Wenn möglich bitte wieder mit ein wenig Source, dann verstehe ich es besser.
Gruß Egbert
-
Die ofstream Klasse (aus fstream) befindet sich im Namensraum std (Standard). Wenn du nicht immer std::ofstream schreiben willst, musst du den Namensraum mit dieser Anweisung öffnen. Siehe auch dazu ein beliebiges Tutorial zu namespaces in C++.
2.
Genau das. endl (eigentlich std::endl) macht einen Zeilenumbruch sowie einen flush (leert den Puffer). Alternativ kann man auch schreibenout << Memo1->Lines->Strings[i].c_str() << "\n";3. Das geht so.
#include <fstream> #include <string> using namespace std; ifstream ein("File.txt"); // Datei öffnen string tstr; // Hilfsvariable while( getline(ein,tstr) ) // eine ganze Zeile einlesen bis Fileende erreicht wurde { Memo1->Lines->Add(tstr.c_str()); } ein.close();Ich hab das hier über einen std::string gemacht. Theoretisch funktioniert das auch mit einem AnsiString. Damit das funktioniert muss aber die Reihenfolge der Includes beachtet werden (iostream include vor der vcl). Das steht irgendwo in der Hilfe zu AnsiString. Ich hab das aber mit AnsiString direkt noch nicht gemacht. So wie oben gezeigt sollte es aber funktionieren.
Ciao
-
Vielen Dank für die schnelle Antwort und ausführliche Info. Das sagt mir wenigstens was! Bei Delphi ist das alles ein wenig anders, deshalb meine Fragerei. Bitte um Verständnis.
Hab mal beide Speicherroutinen ausprobiert und dann mit LoadFromFile() wieder eingelesen. Bei der von FB, stand wirres Zeug drin. Vielleicht muss man die Daten ja anders einlesen. Hingegen, deine Speicherroutine gab das zurück, was gespeichert wurde. Nun werde ich das Einladen ebenfalls ausprobieren. Sicherlich ist das nicht meine letzte Frage und ich würde mich freuen, wieder entsprechende Infos zu bekommen.Und da fällt mir gleich noch etwas ein. Die String-Variable wurde in
"ofstream out(s);" nicht akzeptiert.String s=SaveDialog1->FileName; using namespace std; ofstream out(s); for(int i=0; i<Memo1->Lines->Count; i++) { out << Memo1->Lines->Strings[i].c_str() << endl; } out.close();Danke und Gruß Egbert
-
Der Konstruktor von ofstream erwartet ein char*, du übergibst aber String.
Sieh mal in die Hilfe zu AnsiString c_str() (AnsiString ist das Gleiche wie String). In der FAQ steht ebenfalls was dazu.
-
Jetzt klappt es!
Danke und Gruß Egbert
-
Was ist den genau der Unterschied zwischen meiner Routine und der mit ofstream?
Ich benutze immer die fopen, gibts da Nachteile?
gruß FB
-
Hallo
fopen : alter C - Style (C-Strings)
fstream : umfangreicherer und sicherer C++ Style (std::string)In BCB sollte man also letzteres nehmen (wenn man nicht TFileStream will, die VCL-Methode)
bis bald
akari
-
Hallo,
zunächst möchte ich sagen, dass beide Routinen bei mir laufen. Bei fopen wurde kein Zeilenumbruch mit abgespeichert, obwohl ich sogar einen angefügt habe. Zu Anfang sagte ich zwar, dass wirres Zeug drin stand, muss mich korrigieren. Der komplette Text stand lediglich in eine Zeile. Vielleicht habe ich ja da was falsch gemacht.
Bei fstream hingegen wurde der Zeilenumbruch korrekt mit gespeichert. In beiden Fällen habe ich die gespeicherten Dateien wieder mit LoadFromFile eingeladen, um das Ergebnis zu sehen. Habe mich daher für fstream entschieden.
Auf diesem Wege möchte ich mich noch einmal ganz herzlich für eure Hilfe bedanken. Sicherlich brauche euch noch öfters.
Gruß Egbert.
-
Egbert schrieb:
Hallo,
zunächst möchte ich sagen, dass beide Routinen bei mir laufen. Bei fopen wurde kein Zeilenumbruch mit abgespeichert, obwohl ich sogar einen angefügt habe.Das liegt daran das du den File mit "wb" geöffnet hast und nicht mit "w" oder?
gruß FB
-
das wußte ich nicht

Danke u.Gruß Egbert