fstream closes() automatisch am ende der scope?
-
hallo!
kann es sein, dass ein fstream der über open() geöffnet wurde sich automatisch wieder closed wenn die funktion / scope fertig ist?
zumindestens hatte ich das problem als ich eine LOGFILE-Klasse gekapselt habe in der im Konstruktor das fstream-objekt geopened wurde. aber wenn ich danach irgendeine member-routine aufgerufen habe, die was in den stream schreiben sollte e.g. dann war er wieder zu
muss ich für sowas etwa n externen thread machen nur damit fstream geöffnet bleibt? ich hab in der msn nichts darüber gefunden...
danke
chris90
-
Ja, der Destruktor erledigt das.
EDIT
muss ich für sowas etwa n externen thread machen nur damit fstream geöffnet bleibt? ich hab in der msn nichts darüber gefunden...
Öffne ihn doch einfach neu, wo ist das Problem?
PS: es heißt MSDN nicht MSN

-
moment - der detstruktor von fstream sollte doch gar nicht aufgerufen werden, da mein fstream-objekt als member in der klasse deklariert ist. d.h. im konstruktor initialisiere ich das objekt lediglich.
wieso sollte das objekt direkt nach der initialisierung wieder zerstört werden?
Beispielcode:
class A { A(){ mystream.open("hallo.txt", ios::in); } fstream mystream; void MemberFunc(){fstream.get(NULL);} };wenn ich jetzt erstmal ein objekt der klasse A deklariere und dann initialisiere sollte mystream ja wohl dauerhaft geöffnet sein, oder?
wenn ich danach aber über die MemberFunc() was rauslesen will stelle ich fest dass er wieder geschlossen ist... wieso????
und wie kann ich ihn offenhalten solange ich das will?chris90
-
Wenn Du zu Anfang jedes Scope wo Du loggst einen neuen Logger auf dem Stack erstellst, klar, mit Vernichtung des Loggers ist auch der Stream weg (wo sollte er gespeichert werden?). Aber das macht man normalerweise auch nicht ;). Für so einen Logger ist z.B. ein Singleton-Ansatz ganz brauchbar...
EDIT:
Ok der Post war vorhin noch nicht da - Problem verdeutlicht.
Also meine Loggerklasse erzeugt den fstream static, initialisiert ihn bei erster Benutzung, und schließt sich nur (bzw. wird bad()) wenn ich was ungezogenes tu.
-
siehe meinen beitrag oben ^^
natürlich zerstöre ich meine klasse A nicht !
die ist global...
-
Hab doch schon geändert

-
sry - dein EDIT war noch nicht da

also ist der trick das ding static zu machen?
ist es denn wirklich so, dass sich das ding bei obigem code schließt am ende des konstruktors?
-
Nein, wichtig ist halt nur dass Dein stream-Objekt lange genug lebt (das ist jetzt der Fall solange das Objekt vom Typ A existiert. Bei static wäre das die gesamte Programmlaufzeit), und das tut es ja jetzt schon.
Du musst allerdings schauen ob Du dem Stream irgendwas antust was nicht den Regeln entspricht. Genauso wie die C-IO-Funktionen auf Fehler laufen können und danach nicht einwandfrei sind, passiert das Streams natürlich auch. Das heisst nicht unbedingt dass er geschlossen ist, aber ein anschliessender read/write geht trotzdem schief. Würde mich bei einem get(NULL) aber nichtmal wundern (geht das durchn Compiler?)
Die Antwort lautet fürchte ich also: Das allein ist noch nicht falsch, Du machst irgendeinen Fehler in Code den wir nicht kennen.
-
ok das get(NULL) war auch nurn beispiel das ich im code natürlich nicht verwende...
ich hab mir das auch schon gedacht, dass der fehler an ner anderen stell liegt, aber das problem ist eben dass ich nicht weiß was ich schon groß falsch mache...naja ich werde es selbst nochmal versuchen
danke
chris90