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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé 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
    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 ?

  2. #2
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    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 éclairé 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
    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 ).

  4. #4
    Rédacteur/Modérateur


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

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 152
    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
    Membre Expert
    Avatar de Pyramidev
    Homme Profil pro
    Tech Lead
    Inscrit en
    Avril 2016
    Messages
    1 513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Tech Lead

    Informations forums :
    Inscription : Avril 2016
    Messages : 1 513
    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 éclairé 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
    Par défaut
    Super réponses, merci tout le monde !

+ 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