struct mit String in Datei schreiben
-
er muss char* benutzen wenn er eine struktur abspeichern will. Versuch du mal einen std::string abzuspeichern welche den speicher Dynamisch allokiert. Er muss den Speicher Statisch allokiert haben, sonst bekommt er fehlausgaben oder sein PC fliegt aus dem Fenster dank systemabstürzen.
Stimmt, im Bezug auf Dateien hatte ich char* hier gar nicht bemerkt, hast Recht.
Kurz: Nur Buildintypes sind möglich.
Das allerdings stimmt nicht unbedingt, man kann sehr wohl auch Klassen nehmen, die dann allerdings keine Zeiger o.Ä. enthalten dürfen.
EDIT: D.h. POD Typen sind möglich.
MfG Eisflamme
-
Hi
Also ich nehm jetzt die std::ofstream Klasse zum speichern. structs benutz ich übrigens nur um es übersichtlicher zu machen.
Das char * speicher ich jetzt so ab:
struct filestruct { int StrLen; char * Str; } Str = "Test.bmp"; StrLen = strlen(Str); // jaja, C-Funktion :) ofstream.write((char*)&StrLen, sizeof(int)); // Länge schreiben for (int i = 0; i < StrLen; i++) { ofstream.put(Str[i]); // Zeichen für Zeichen schreiben }
Wahrscheinlich würde ein stl String auch gehen aber warum? char * reicht auch und ist wahrscheinlich genau so schnell
Daniel
-
DanielD schrieb:
Hi
Also ich nehm jetzt die std::ofstream Klasse zum speichern. structs benutz ich übrigens nur um es übersichtlicher zu machen.
Das char * speicher ich jetzt so ab:
struct filestruct { int StrLen; char * Str; } Str = "Test.bmp"; StrLen = strlen(Str); // jaja, C-Funktion :) ofstream.write((char*)&StrLen, sizeof(int)); // Länge schreiben for (int i = 0; i < StrLen; i++) { ofstream.put(Str[i]); // Zeichen für Zeichen schreiben }
Wahrscheinlich würde ein stl String auch gehen aber warum? char * reicht auch und ist wahrscheinlich genau so schnell
Daniel
Nimm statt dem C-Cast, static_cast<>() in diesem Falle oder aber wenn es sein
muss dynamic_cast<>() oder reinterpret_cast<>().Warum schreibst du die Zeichenkette Zeichen fuer Zeichen in die Datei? Die
kannst du getrost auch mittels << oder .write() in die Datei schreiben.mfg
v R
-
Nimm statt dem C-Cast, static_cast<>() in diesem Falle oder aber wenn es sein
muss dynamic_cast<>() oder reinterpret_cast<>().Warum schreibst du die Zeichenkette Zeichen fuer Zeichen in die Datei? Die
kannst du getrost auch mittels << oder .write() in die Datei schreiben.mfg
v Rmmh, also .write(Str, StrLen), oder?
Daran hab ich gar nicht gedacht
Was für einen Cast meinst du?Daniel
-
Ich meinte diesen Cast:
ofstream.write((char*)&StrLen, sizeof(int)); //wuerde ich so schreiben ofstream.write(static_cast<char*>(&StrLen), sizeof(int));
mfg
v R
-
virtuell Realisticer schrieb:
Ich meinte diesen Cast:
ofstream.write((char*)&StrLen, sizeof(int)); //wuerde ich so schreiben ofstream.write(static_cast<char*>(&StrLen), sizeof(int));
mfg
v RAh, Ok
Danke für deine HilfeDaniel
-
Hm, also wenns variabel sein soll, dann schreib einfach erst die länge des
Strings in die Datei, und danach den string selber. Oder mach aus jedem String
eine Zeile, dann kannst du den wieder mit getline einlesen.Devil
-
struct MyStruct { int X, Y; string VarStr; }; ostream & operator << (ostream & os, const MyStruct & foo) { os << foo.X << ... << foo.VarStr.length() << foo.VarStr; } ... MyStruct myStruct ofstream datei ("..."); datei << myStruct;
Fertig. Ne, moment, das wäre irgendwie trivial, darum kanns hier nicht gehen. Worum geht's hier eigentlich?
-
@helium nein so klappt das nich, damit bin auch ich erst vor kurzem auf die nase geflogen.
du kannst in die datei zwar so reinschreiben,aber selbst bei aktiviertem binary flag schreibt der << operator jeden wert als char wert.
-
Ist klar. Als char-Wert. LOL.
Wenn ich einen int an den Stream schicke, dann kommt da auch ein int rein. Im textmodus eben als Zahl, im Binärmodus als vier Bytes (32Bit System). Genau so siehts mit Strings aus. Strings sind quasi Ketten von chars, sehen also im Text und Binärmodus gleich aus, bis auf möglicherweise newlines. (windows: \r\n ...)