fstream in klassen geht nicht richtig?
-
Hallo,
ich hab folgendes Programm:
#include <stdio> #include <iostream> #include <string> #include <cstring> #include <stdlib> class test { public: bool dateispeichern(const string &filename); bool dateiladen(const string &filename); void setzevariable(const int &wert); private: int variable; fstream file; }; bool test::dateispeichern(const string &filename) { file.open(filename.c_str(), ios::out | ios::binary); if (file.is_open()) { file.write (reinterpret_cast<char *>(&variable), sizeof(int)); file.close(); return true; } else { return false; } } bool test::dateilesen(const string &filename) { file.open(filename.c_str(), ios::in | ios::binary); if (file.Is_open()) { file.read(reinterpret_cast<char *>(&variable), sizeof(int)); file.close(); return true; } else { return false; } } void test::setzevariable(const int &wert) { variable = wert; } int main() { test Testobjekt Testobjekt.dateilesen("C:\\test.bin"); Testobjekt.setzevariable(5); Testobjekt.dateischreiben("C:\\test1.bin"); return 0; }das ergebnis ist eine 0 byte datei, das lesen klappt auch, setze ich jetzt jedoch den fstream direkt in die memberfunktion dann klappts, nur es klappt nicht wenn ich ihn private setze.
Was ist falsch?
Gruß und danke im voraus
Hans
-
Wie genau äußert sich dieses "klappt nicht"? Und was für einen inn macht es, den Stream ständig hinter deinem Objekt hinterherzuziehen?
(PS: Ich würde ja vermuten, daß du beim Lesen auf ein EOF gestoßen bist und dadurch den Stream in Fehlerstatus gesetzt hast)
-
Das problem is das beim schreiben immer eine 0 byte datei erzeugt wird.
-
CStoll schrieb:
PS: Ich würde ja vermuten,
Oh, wieder das obligatorische 'Ich würde ja vermuten...'. Ein Hochgenuss, darauf hatte ich schon gewartet!

@HansGeorg: Da ich ja mal CStoll hinsichtlich seiner Vermutungen sehr vertraue, solltest du den Stream mal mit if(!file.good()) checken, ob ein Errorbit gesetzt wurde... Das würde auch die leere Datei erklären.
-
HansGeorg schrieb:
Das problem is das beim schreiben immer eine 0 byte datei erzeugt wird.
Das liegt wohl hauptsächlich daran, daß du nicht prüfst, ob das Lesen wirklich geklappt hat. Aus einer 0 Byte Datei kannst du schlecht lesen, also setzt der Stream dort eofbit und failbit - und in dem Zustand weigert er sich, irgendwas zu machen (bis die Fehlerflags zurückgesetzt werden).
Außerdem frage ich mich immer noch, WIESO du den Stream unbedingt als Member der Klasse anlegen willst.
@mikey: Ja, manchmal zeigt meine Kristallkugel tatsächlich noch etwas an

-
So jetzt aber mal nen paar Fragen und Anmerkungen:
1. .0 Warum ist das std::fstream-Objekt eine Membervariable von der Klasse? 2. .1 <stdlib>, was ist das? <cstdlib> meinst du vielleicht ... .2 <stdio>, was ist das? <cstdio> meinst du vielleicht ... .3 <cstring>, <cstdio>, <cstdlib> brauchst du nicht. 3. .1 std::ios (Basisklasse von std::fstream) hat bereits den operator! überladen. Guck dir den evtl. einmal an. Das steigert die Übersichtlichkeit. .2 Wenn du nur ein return im else-Zweig hast, wäre es logisch, den if-Zweig umzudrehen.if (x == true) { /* ... */ return true; } else { return false; }=>
if (x == false) return false; /* ... */ return true;.3 Beim zerstören eines std::fstream's wird automatisch die Funktion close aufgerufen! => Unnötig. 4. .0 Wenn du castest, caste direkt in den gewünschten Typ. Beachte dabei auch const! (s. std::fstream::write) 5. .0 C++ Syntax ist nicht upper/lower-case unabhängig. D.h. du kannst nicht "Is_open" anstelle von "is_open" schreiben!Vlg Deviloper ^^
PS: Ist nicht böse gemeint, sondern soll deinen Stil verbessern!
PPS: Beim Programmieren eignet sich Englisch am besten als Sprache, da dort nicht Umlaut vorhanden sind.