Close() ...



  • Dass nach dem dein Programm beendet wurde das zuletzt Gelesene fehlt? 😃



  • Entschuldigt, schon wieder, ich benutze Windows XP Home, bzw Windows 7 Home Premium und VS 2008 Standard und VS 2010 Proferssional.



  • Aha.
    Ändert nichts an dem was dir hier bereits geantwortet wurde.
    Sämtliche Windows Systeme zählen nicht zu "irgendwelchen Exoten", und schliessen brav Files die ein Prozess noch offen hatte, wenn dieser terminiert.


  • Mod

    Es geht auch nichts verloren, was vor einem fehlenden close geschrieben wurde. Zumindest bei einem regulären Programmabbruch ist bei Sprachen wie C (und auch bei anderen nicht-exotischen Sprachen) festgelegt, dass noch offene Dateien geschlossen werden. Und zwar nicht durch das Betriebssystem, sondern sogar vom Programm selber!
    Interessanter ist die Frage, was bei nicht regulärem Programmende (z.B. kill-Signal oder noch härter (da auch das OS überrumpelt wird): ein Hardwarereset) passiert...



  • Hä? Ich sehe zu viele halbangefangene Dateien, um so einfach jetzt zu sagen, das würde immer klappen.

    #include <fstream>
    
    int main(){
        using namespace std;
        ofstream* housten=new ofstream("problem.txt");
        for(int i=0;i<2000;++i)
            *housten<<i<<'\n';
    }
    

    Selbes Problem, wenn man in VB die Datei-Streams nicht mit using anfaßt. Auf einen Test mit FILE darf ich verzichten, der würde nicht spannend.

    Was zum Betriebssystems runtergeschickt wurde (z.B. per write-Aufruf), landet auch auf der Platte, selbst wenn das Programm abstürzt.


  • Mod

    volkard schrieb:

    Hä? Ich sehe zu viele halbangefangene Dateien, um so einfach jetzt zu sagen, das würde immer klappen.

    Ich habe es ehrlich gesagt nie ausprobiert, aber im C- und C++-Sprachstandard steht, dass bei Verlassen der main-Funktion oder beim Aufruf von exit() alle offenen Dateistreams geflusht und geschlossen werden. Wenn man abstürzt passiert das natürlich nicht. Aber dass das mit einem dynamisch angelegten ofstream nicht gehen soll wundert mich nun schon ziemlich. Fehler in der Implementierung oder Missverständnis des Sprachstandards meinerseits?



  • Fehler in der Implementierung oder Missverständnis des Sprachstandards meinerseits?

    Ist schon immer so und ich kann es mir auch nicht anders sinnvoll vorstellen.

    SeppJ schrieb:

    aber im C- und C++-Sprachstandard steht, dass bei Verlassen der main-Funktion oder beim Aufruf von exit() alle offenen Dateistreams geflusht und geschlossen werden.

    Kann mich daran gar nicht erinnern.



  • SeppJ schrieb:

    Aber dass das mit einem dynamisch angelegten ofstream nicht gehen soll wundert mich nun schon ziemlich. Fehler in der Implementierung oder Missverständnis des Sprachstandards meinerseits?

    Missverständnis deinerseits.
    Ein ostream ist auch nur eine normale Klasse, und beim Verlassen des Programms werden keine Destruktoren für dynamisch erzeugte Objekte ausgeführt. (Wie auch, die werden in C++ ja nirgends getrackt. 😉
    Daher hat der ostream auch keine Chance seine Puffer zu flushen.

    *: Ginge auch gar nicht. C++ erlaubt dir sogar ein Objekt durch Überschreiben mittels eines Char-Zeigers zu zerstören, so lange die Korrektheit des Codes nicht davon abhängig ist dass der Konstruktor Destruktor läuft. (Und der Konstruktor Destruktor darf natürlich dann nicht mehr ausgeführt werden, da das Objekt ja bereits durch das Überschreiben mittels eines Char-Zeiger als zerstört gilt)

    ps: OK, natürlich könnte der ostream sich irgendwo in eine globale Liste eintragen, und dann mittels eines statischen Destruktors alle gelisteten Objekte bei Programmende zerstören. Theoretisch gäbe es also schon Möglichkeiten. Der Standard sieht das aber soweit ich weiss nicht vor -- bei keiner Klasse der SCL.



  • *: Ginge auch gar nicht. C++ erlaubt dir sogar ein Objekt durch Überschreiben mittels eines Char-Zeigers zu zerstören, so lange die Korrektheit des Codes nicht davon abhängig ist dass der Konstruktor läuft. (Und der Konstruktor darf natürlich dann nicht mehr ausgeführt werden, da das Objekt ja bereits durch das Überschreiben mittels eines Char-Zeiger als zerstört gilt)

    Vermute, Du meinst Destruktor.



  • Upps, ja, danke. Habs korrigiert.


Anmelden zum Antworten