IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Doit-on utiliser close sur un fstream ?


Sujet :

C++

  1. #1
    Membre averti Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Points : 341
    Points
    341
    Par défaut Doit-on utiliser close sur un fstream ?
    Salut à toutes et à tous !

    Une question que j'ai dans la tête mais qui ne semble pas avoir été traitée ici :
    doit on appeller manuellement la méthode close() sur un objet ftsream ou bien laisser le destructeur s'en occuper ?
    Ici sur stackoverflow, certains semblent dire que le destructeur fait ça très bien.
    Mais ici dans la FAQ les méthode close sont dans certains cas appelées explicitement...

    Qu'en pensez-vous ?
    Le débutant, lui, ignore qu'il ignore à ce point, il est fier de ses premiers succès, bien plus qu'il n'est conscient de l'étendue de ce qu'il ne sait pas, dès qu'il progresse en revanche, dès que s'accroît ce qu'il sait, il commence à saisir tout ce qui manque encore à son savoir. Qui sait peu ignore aussi très peu. [Roger Pol-Droit]
    Github
    Mon tout premier projet: une bibliothèque de simulation de génétique des populations

  2. #2
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    http://en.cppreference.com/w/cpp/io/basic_fstream/close

    This function is called by the destructor of basic_fstream when the stream object goes out of scope and is not usually invoked directly.
    Tu appelles close quand tu veux conserver le handle pour une réutilisation ultérieure. C'est plutôt rare.

  3. #3
    Membre averti Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Points : 341
    Points
    341
    Par défaut
    Citation Envoyé par Matt_Houston Voir le message
    http://en.cppreference.com/w/cpp/io/basic_fstream/close
    Tu appelles close quand tu veux conserver le handle pour une réutilisation ultérieure. C'est plutôt rare.
    Merci de ta réponse Mais si on en a besoin ultérieurement, pourquoi ne pas le laisser ouvert ? Au cas où on devrait/pourrait avoir un deuxième fstream sur la même ressource ?
    Aurais-tu un petit exemple d'un cas d'utilisation où il vaut mieux appeler close ? (désolé, mon esprit de noob s'adapte mal aux généralités ).
    Le débutant, lui, ignore qu'il ignore à ce point, il est fier de ses premiers succès, bien plus qu'il n'est conscient de l'étendue de ce qu'il ne sait pas, dès qu'il progresse en revanche, dès que s'accroît ce qu'il sait, il commence à saisir tout ce qui manque encore à son savoir. Qui sait peu ignore aussi très peu. [Roger Pol-Droit]
    Github
    Mon tout premier projet: une bibliothèque de simulation de génétique des populations

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    - garder un fichier ouvert est pas forcément top ou possible
    - si tu veux ouvrir un autre fichier
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Expert éminent
    Avatar de Pyramidev
    Homme Profil pro
    Développeur
    Inscrit en
    Avril 2016
    Messages
    1 471
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 471
    Points : 6 110
    Points
    6 110
    Par défaut
    Salut,

    Pour la documentation, de manière générale, il faut privilégier en.cppreference.com qui est souvent plus précis que www.cplusplus.com

    Dans la page de std::basic_fstream ( http://en.cppreference.com/w/cpp/io/basic_fstream ), on lit clairement : « (destructor) [virtual] (implicitly declared) destructs the basic_fstream and the associated buffer, closes the file »

    Dans la page http://www.cplusplus.com/reference/f...basic_fstream/ , il n'y a pas de mention directe du destructeur. Par contre, la doc précise que std::basic_fstream encapsule un std::basic_filebuf dont la doc du destructeur ( http://www.cplusplus.com/reference/f...basic_filebuf/ ) précise : « Before being destroyed, member function close is automatically called. »
    Dans cet exemple, on finit par avoir l'info aussi, mais plus difficilement.

    Citation Envoyé par Seabirds Voir le message
    Mais si on en a besoin ultérieurement, pourquoi ne pas le laisser ouvert ? Au cas où on devrait/pourrait avoir un deuxième fstream sur la même ressource ?
    Aurais-tu un petit exemple d'un cas d'utilisation où il vaut mieux appeler close ? (désolé, mon esprit de noob s'adapte mal aux généralités ).
    Personnellement, un cas où j'ai dû appeler explicitement close(), c'est quand je voulais envoyer un fichier de log par mail. Pour que ça fonctionne, j'ai dû fermer le fichier, puis appeler une fonction qui l'envoie par mail, puis le rouvrir.
    Dans ce contexte, il est plus simple de travailler avec le même objet de flux que d'en détruire un puis en créer un autre.
    Un autre cas est celui où j'ai dû changer le chemin d'un fichier de log. J'ai fermé le fichier, puis je l'ai coupé-collé, puis je l'ai rouvert. La raison est que mon application avait besoin de loguer très tôt, bien avant l'étape où mon application savait quelle devait être l'adresse finale du fichier de log.

    A part ça, la différence entre close() et le destructeur de std::basic_fstream, c'est que close() peut lancer une exception que tu peux gérer comme tu veux, par exemple en écrivant dans un fichier de log un message d'erreur. Par contre, le destructeur de std::basic_filebuf (appelé par celui de std::basic_fstream) intercepte les éventuelles exceptions lancées par close() et ne les propage pas.

  6. #6
    Membre averti Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Points : 341
    Points
    341
    Par défaut
    Super réponses, merci tout le monde !
    Le débutant, lui, ignore qu'il ignore à ce point, il est fier de ses premiers succès, bien plus qu'il n'est conscient de l'étendue de ce qu'il ne sait pas, dès qu'il progresse en revanche, dès que s'accroît ce qu'il sait, il commence à saisir tout ce qui manque encore à son savoir. Qui sait peu ignore aussi très peu. [Roger Pol-Droit]
    Github
    Mon tout premier projet: une bibliothèque de simulation de génétique des populations

  7. #7
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    De manière générale, la manipulation de fichiers va passer par une foule assez importante de ce qu'il convient d'appeler des appels système : des instructions spécifiques au système d'exploitation sur lequel l'application sera exécutée.

    Le gros problème, c'est donc de savoir... comment le système d'exploitation pourra bien réagir face, par exemple, à toute tentative d'ouverture d'un fichier qu'il sait être déjà ouvert (et n'avoir pas été fermé) "par ailleurs".

    La plupart des systèmes vont placer ce que nous pourrions appeler des "verrous" (locks) sur les fichiers ouverts en faisant en sorte d'empêcher de manière systématique l'ouverture d'un fichier qui aurait déjà été marqué comme ouvert (et non refermé). Même s'il se peut que le système d'exploitation renonce à le faire sur un fichier qui serait ouvert en "lecture seule" (et encore, rien n'est moins sur), il y a très peu de chance qu'il le fasse sur un fichier ouvert "en écriture", vu que chaque écriture dans le fichier va avoir un grand nombre de conséquences "matérielles" (dont, entre autres, au niveau du "système de fichiers" utilisé par le support sur lequel se trouve le fichier).

    A la lueur de ces explications, tu vas sans doute te rendre compte que, bien que tu puisse effectivement envisager de garder un fichier ouvert "aussi longtemps que tu en auras besoin", c'est une décision qui risque d'avoir énormément d'impact non seulement sur ta propre application, mais aussi... sur l'ensemble de ton système d'exploitation; et principalement sur... les applications qui, pour une raison ou une autre, devraient avoir accès au même fichier.

    Il serait sans doute vain de t'interdire de garder un fichier ouvert dans ton application. Après tout, tu gardes ton libre arbitre, et ma propre liberté de choix s'arrête là où commence la tienne . Mais, vu que tu poses la question, je suis en droit de te présenter mon point de vue sur le sujet : c'est généralement une aussi mauvaise idée que celle qui pourrait te traverser l'esprit de diriger un fusil chargé sur ton pied et de presser la détente : tu peux le faire, mais tu sais ce que tu risques à le faire
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  8. #8
    Membre averti Avatar de Seabirds
    Homme Profil pro
    Post-doctoral fellow
    Inscrit en
    Avril 2015
    Messages
    294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Post-doctoral fellow
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2015
    Messages : 294
    Points : 341
    Points
    341
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Il serait sans doute vain de t'interdire de garder un fichier ouvert dans ton application.
    Dans ma petite tête de débutant, un conseil validé par développez.com a valeur d'interdiction sacrée
    J'ai appris à appliquer vos conseils avec confiance, même si c'est parfois sans trop bien les comprendre, auquel cas je sais que ça prendra son sens plus tard

    Merci de ta réponse en tout cas !
    Le débutant, lui, ignore qu'il ignore à ce point, il est fier de ses premiers succès, bien plus qu'il n'est conscient de l'étendue de ce qu'il ne sait pas, dès qu'il progresse en revanche, dès que s'accroît ce qu'il sait, il commence à saisir tout ce qui manque encore à son savoir. Qui sait peu ignore aussi très peu. [Roger Pol-Droit]
    Github
    Mon tout premier projet: une bibliothèque de simulation de génétique des populations

  9. #9
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Il est bien éduqué, celui-là…

    N'hésite surtout pas à demander plus d'explication quand tu ne comprends pas bien.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  10. #10
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Un autre angle sur le sujet. (NB j'ai aussi croisé le cas anecdotique du logger où il est préférable de fermer pour ouvrir un nouveau fichier, mais je vais m'étendre sur un autre cas d'utilisation)

    En ce qui me concerne, la question de garder un fichier ouvert ne se pose pas car mes utilisations de fichiers sont précisément cadrées dans des portées, et donc mes fichiers sont fermés lorsque la variable fstream est détruite. Quand je le peux, je fuis comme la peste les pointeurs sur des flux et autres listes dont la portée peut transcender la fonction qui voit l'ouverture et le traitement du fichier. SRP oblige, je réduis la portée d'utilisation du fichier/flux au strict minimum nécessaire.

    Dans mon cas, on peut se demander à quoi fstream::close peut bien servir. Il y a un cas: si je dois savoir si la fermeture a échoué. Typiquement, si j'écris sur un disque distant qui se déconnecte/un disque qui flambe/une clé arrachée/etc avant la fermeture du fichier, et que je veux le savoir pour réagir en conséquence. Dans ce cas là, je ferme explicitement pour analyser l'état du flux après l'appel à fstream::close -- qui ne lance pas d'exception par défaut.
    Honnêtement, dans les applications que je développe je n'ai jamais eu à me poser cette question, pourtant légitime sur des systèmes critiques. Je me contente du RAII et sa limitation qui ne me permet pas de savoir si la restitution de la ressource a échoué.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [CKEditor] Qui utilise FCKeditor sur son site php pour config ?!
    Par guy2004 dans le forum Bibliothèques & Frameworks
    Réponses: 62
    Dernier message: 26/10/2005, 18h24
  2. Réponses: 6
    Dernier message: 10/06/2005, 23h56
  3. Réponses: 2
    Dernier message: 30/11/2004, 09h42
  4. [Sybase] Utilisation indexes sur table Proxy
    Par MashiMaro dans le forum Sybase
    Réponses: 2
    Dernier message: 20/02/2004, 10h20
  5. [Utilisation Postgresql sur windows]
    Par xhercule dans le forum PostgreSQL
    Réponses: 6
    Dernier message: 26/01/2004, 18h36

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo