Datei close() nötig?



  • nman schrieb:

    dasding123 schrieb:

    wird automatisch gemacht aber für mich ists schlechter stil wenn dus weglässt.

    Warum sollte es schlechter Stil sein, Redundanz zu vermeiden?

    Schlechter Stil ist auch unleserlicher Code. Und aus den paar Takten mach ich mir gar nix, höchstens der Optimizer 😉
    Dafür ist es lesbarer.

    Ist gibt nämlich auch, wer hätte es gedacht, Funktionen die nicht so aussehen

    void Foo()
    {
      // Datei öffnen
       // 5 zeilen code
    }
    

    Aber das ist eben Ansichtssache. Bei Minifunktionen lass ichs aber auch weg.



  • dasding123 schrieb:

    Schlechter Stil ist auch unleserlicher Code. Und aus den paar Takten mach ich mir gar nix, höchstens der Optimizer 😉
    Dafür ist es lesbarer.

    Ach was, dann dürfte ich ja auch nicht ifstream foo("foo.bar"); schreiben sondern nur ifstream foo; foo.open("foo.bar");
    Der Grund aus dem ich gegen ein explizites foo.close() bin ist nicht Performance; wenn Du foo.close() weglässt wird Dein Code nämlich nicht performanter. Es geht vielmehr darum dass man dank RAII den close-Aufruf ganz einfach weglassen kann; eine der schönen Seiten an modernem C++.

    Ist gibt nämlich auch, wer hätte es gedacht, Funktionen die nicht so aussehen

    void Foo()
    {
      // Datei öffnen
       // 5 zeilen code
    }
    

    Ich verstehe leider nicht, was Du mir damit sagen möchtest.



  • Ich verstehe leider nicht, was Du mir damit sagen möchtest.

    Ist doch klar. Er will dir sagen, das er gerne riesiege unhandhabbare Codemonster baut.

    @dasding123: sowas geht auch

    void foo ()
    {
       { 
          ifstream datei("pfad");
          ... // lies was aus der Datei
       }
    
       ... // weiterer Code
    }
    


  • Also wenn ich so einen Code lese, denke ich an ein Resource-Leak:

    void foo()
    {
      Class obj("foo");
      //...
      if(something_happened()) return;
      //...
      obj.close();
    }
    

    Das sieht doch so aus, als würde Class kein RAII implementieren und man hätte durch das return obj nicht ordnungsgemäß freigegeben...

    Lasse ich das obj.close(); dann kann man davon ausgehen, dass obj ordnungsgemäß im Ctor zerstört wird.



  • Dann doch lieber close() 🙂

    Mal im Ernst, der Missionierungseifer hier geht mir manchmal gewaltig auf den Senkel.



  • Helium schrieb:

    Ist doch klar. Er will dir sagen, das er gerne riesiege unhandhabbare Codemonster baut.

    Ja, nur kenne ich niemanden der das freiwillig in aller Öffentlichkeit zugeben würde. 🙂



  • Das ist immer die schönste Art, über andere herzuziehen und "Witze" zu machen.
    Ein bischen Ignoranz schadet scheinbar nie. Ja, ich programmiere nur Codemonster, inperformant und bin auch privat ein Arschloch.

    Mehr will ich nicht mehr dazu sagen. 👎



  • Ja und wie ist das jetzt wenn bei close() wirklich ein Fehler autritt wie Kde das gesagt hat? sollte man das wirklich ignorieren?



  • Wenn du unbedingt das failbit testen willst (wozu auch immer) - dann schreibe dir einen Guard dafür, der im Dtor .close() aufruft und das failbit checkt.

    Das hier ist imho der sinnvollste Ansatz.

    Ich kenne mich mit der Windows API nicht gut aus, aber auch dort kann CloseHandle() eine Ausnahme werfen (Grade bei m$ nachgeschaut). Unter Linux kann fclose folgendes machen:

    The fclose function may also fail and set errno for any of the errors
    specified for the routines close(2), write(2) or fflush(3).

    D.h. Wenn man ein modernes Betriebsystem mit Buffern und Caches verwendet kann es durchaus sein das man mehr in eine Datei schreibt als Festplattenplatz vorhanden ist (Beispiel). Diese Art von Fehler wird erst beim schließen sichtbar. Erst wenn die Datei erfolgreich geschlossen ist, ist auch garantiert das sie vollständig ist (Soweit der Programmierer das überprüfen kann).

    Aber so ein "haufen Aufwand" ist vielleicht zuviel wenn man bloß bisschen Text in irgendein Logfile knallen will oder wenn man NUR aus der Datei liest. Sprich es ist einfach Ermessenssache.

    mfg, KdeE

    ps: Ja ich verwende einen "Wächter" :p



  • Bashar schrieb:

    Mal im Ernst, der Missionierungseifer hier geht mir manchmal gewaltig auf den Senkel.

    Verstehe ich nicht, in diesem Thread wurde doch explizit gefragt ob man fstream::close selbst verwenden soll oder ob man dem Destruktor die Arbeit überlassen soll...

    dasding123 schrieb:

    Das ist immer die schönste Art, über andere herzuziehen und "Witze" zu machen.
    Ein bischen Ignoranz schadet scheinbar nie. Ja, ich programmiere nur Codemonster, inperformant und bin auch privat ein Arschloch.

    Jetzt mach mal halblang, wenn Du Dich von solchen Kleinigkeiten schon so beleidigen lässt dann weißt Du scheinbar echt nicht wie es in diesem Forum manchmal zugeht. 🙂



  • nman schrieb:

    Bashar schrieb:

    Mal im Ernst, der Missionierungseifer hier geht mir manchmal gewaltig auf den Senkel.

    Verstehe ich nicht, in diesem Thread wurde doch explizit gefragt ob man fstream::close selbst verwenden soll oder ob man dem Destruktor die Arbeit überlassen soll...

    Aber es kam in etwa die Antwort "close verwendet man nicht, niemals, und wers doch tut ist schlecht".



  • Bashar schrieb:

    Aber es kam in etwa die Antwort "close verwendet man nicht, niemals, und wers doch tut ist schlecht".

    Klar, das ist übertrieben, aber eine angemessene Antwort auf Dinge wie

    wird automatisch gemacht aber für mich ists schlechter stil wenn dus weglässt.

    Im Ernst: Wenn im Webzeugs wieder mal jemand erklärt warum Frames unbedingt auf jeder vernünftig strukturierten Website verwendet werden sollten, dann tendiere ich auch zu Pauschalisierungen à la "Frames verwendet man nicht, niemals, und wers doch tut ist schlecht".



  • Auch wenn derjenige dir dann einen Spezialfall demonstriert, in dem Frames u.U. doch sinnvoll sind? (Falls es diesen nicht geben sollte war das ein schlechter Vergleich 😉 )



  • Schlechter Stil ist auch unleserlicher Code. Und aus den paar Takten mach ich mir gar nix, höchstens der Optimizer 😉

    hey... die Taktezählerei hab ich schon seit mindestens 1,5 Jahren hinter mir. 🙂

    btw. ist es natürlich sowieso unsinnig, bei einem Dateizugriff noch mit irgendwelchen Mikrooptimierungen anzufangen, die genau einmal (beim Beenden) zum tragen kommen. 😃



  • Bashar schrieb:

    Auch wenn derjenige dir dann einen Spezialfall demonstriert, in dem Frames u.U. doch sinnvoll sind? (Falls es diesen nicht geben sollte war das ein schlechter Vergleich 😉 )

    Wenn jemand so einen Spezialfall demonstriert (was allerdings relativ selten der Fall ist) dann relativiere ich natürlich meine frühere Aussage. 🙂

    Daher in diesem Falle: Einen Extra-Scope nur um das close zu umgehen finde ich natürlich nicht sinnvoll, aber in den allermeisten Fällen kommt man auch sehr gut ohne close zurecht.



  • Shade Of Mine schrieb:

    Lasse ich das obj.close(); dann kann man davon ausgehen, dass obj ordnungsgemäß im Ctor zerstört wird.

    😃 Du räumst obj aber nicht viel Lebensfähigkeit ein 😃

    PS: Ctor != Dtor



  • nman schrieb:

    Daher in diesem Falle: Einen Extra-Scope nur um das close zu umgehen finde ich natürlich nicht sinnvoll, aber in den allermeisten Fällen kommt man auch sehr gut ohne close zurecht.

    Sag ich doch 😉 Man sollte nicht mehr Aufwand treiben als nötig, nur um das close zu vermeiden. Irgendwo hat dieser Stil-Wahn auch mal seine Grenzen.



  • Bashar schrieb:

    Sag ich doch 😉 Man sollte nicht mehr Aufwand treiben als nötig, nur um das close zu vermeiden. Irgendwo hat dieser Stil-Wahn auch mal seine Grenzen.

    Passt eigentlich auch sehr schön in meine Ansichten rein; Extra-Scopes für sowas sind auch nicht schön (unter anderem weil nicht orthogonal und damit schlechter lesbar).



  • Ihr nehmt das, was ich sage, viel zu ernst 😃

    Aber zu folgendem:

    (unter anderem weil nicht orthogonal und damit schlechter lesbar).

    Was ist wo rechtwinklig?



  • Helium schrieb:

    Was ist wo rechtwinklig?

    http://www.catb.org/~esr/writings/taoup/html/ch04s02.html


Anmelden zum Antworten