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 :

Vérification si un ofstream/ifstream est ouvert à partir d'un ostream/istream


Sujet :

C++

  1. #1
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Décembre 2007
    Messages : 17
    Par défaut Vérification si un ofstream/ifstream est ouvert à partir d'un ostream/istream
    Bonjour,

    J'ai deux méthodes, une servant à écrire un ostream à partir de mon objet, l'autre pour affecter des valeurs à mon objet à partir d'un istream formaté.

    Je me demandais comment je pouvais tester si le fichier est bien ouvert dans le cas où le istream/ostream passé en paramètre est un ifstream/ofstream. Les méthodes .good() et .fail() me montrent bien si le fichier existe ou pas, mais je n'arrive pas à savoir si, dans le cas d'un fichier, celui-ci est ouvert ou pas. Bien sur, puisque les test sont fait sur des istream/ostream, je n'ai pas accès à la méthode is_open().

    Si quelqu'un pouvais m'aider, je lui en serais très reconnaissant.

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Bonjour,
    as tu essayer le if ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void blabla(std::istream &is, std::ostream & os)
    {
    if (is) std::cout<<"flux in ouvert"<<std::endl;
    if (os) std::cout<<"flux out ouvert"<<std::endl;
    }

  3. #3
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Décembre 2007
    Messages : 17
    Par défaut
    Je ne peux pas utiliser les if, puisqu'il s'agit d'un test de la précondition dans l'implantation de la théorie du contrat. J'ai essayé PRECONDITION(os) sans succès (où PRECONDITION(os) revient à un assert(os) plus ou moins).

    Donc, en gros, cette solution ne fonctionne pas lorsque le fichier existe, mais qu'il est fermé.

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par LeFredBleu Voir le message
    Je ne peux pas utiliser les if, puisqu'il s'agit d'un test de la précondition dans l'implantation de la théorie du contrat. J'ai essayé PRECONDITION(os) sans succès (où PRECONDITION(os) revient à un assert(os) plus ou moins).

    Donc, en gros, cette solution ne fonctionne pas lorsque le fichier existe, mais qu'il est fermé.
    ???
    as tu essayé???
    sinon j'ai rien compris as ton explication
    T'as peut être raison

  5. #5
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Décembre 2007
    Messages : 17
    Par défaut
    Oui, oui, j'ai essayé. J'ai utilisé la méthode que tu proposais, mais en faisant le test avec une assertion plutôt qu'un if, et ça ne fonctionne pas. Voici un bout du code, si ça peux aider :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void CompteCheque::serialise (std::ostream& os) const
    {
    	PRECONDITION(!os.fail());
    	PRECONDITION(os);
     
    	Compte::serialise(os);
     
    	os << reqTauxInteret() << std::endl << reqNombreTransactions() << std::endl;
    	os << calculerInteret() << '\n';
    }
    La partie PRECONDITION(os) n'as pas marchée, et PRECONDITION n'est qu'une macro faisant une assertion venant de assert.h avec un message spécifique afin de mieux implanter la théorie du contrat (Design by Contract)

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    avec un cast vers un ofstream?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #include <iostream>
    #include <fstream>
    using namespace std;
     
    void test(std::ostream & os)
    {
        try
            {
            ofstream & osf  = dynamic_cast<ofstream&>(os);
            if (osf.is_open()) std::cout<<"fichier ouvert"<<std::endl;
            else std::cout<<"fichier fermé"<<std::endl;
            }
        catch ( const  bad_cast &)
            {
                std::cout << "ceci n'est pas un fichier"<<std::endl;
            }
     
    }
     
     
    int main()
    {
        ofstream f("essai.txt");
        test(f);
        f.close();
        test(f);
        test(cout);;
     
        return 0;
    }
    [EDIT]
    ce qu'il faut mettre dans le catch

  7. #7
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Décembre 2007
    Messages : 17
    Par défaut
    J'obtiens l'erreur suivante quand j'essaie de faire le dynamic_cast:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error C2680: 'class std::basic_ofstream<char,struct std::char_traits<char> > &' : invalid target type for dynamic_cast
    Alors pas moyen de tester cette méthode non plus.

  8. #8
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    pourtant ce code marche sous gcc..
    Fait attention au std::
    j'en ai pas mis partout à cause du using namespace std;

  9. #9
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Décembre 2007
    Messages : 17
    Par défaut
    J'avais aussi mis un using namespace std. Par contre, c'est un travail pour un cours et on est obligé d'utiliser visual studio 6, avec son compilateur déprécié. L'erreur vient probablement de là ; les librairies qui me sont fournies par le professeur ne compilent même pas avec gcc... et un collègue m'a dit qu'elles ne compilaient pas non plus avec .Net.

    Je garde quand même ta méthode avec le dynamic_cast en tête, ça pourra éventuellement être utile dans un cadre de développement plus "sérieux" et c'était très "propre". Quoi que ça laisse un try-catch dans le code qui ne sera pas désactivé en phase release, mais bon, on ne peut pas tout avoir

  10. #10
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par LeFredBleu Voir le message
    Je garde quand même ta méthode avec le dynamic_cast en tête, ça pourra éventuellement être utile dans un cadre de développement plus "sérieux" et c'était très "propre". Quoi que ça laisse un try-catch dans le code qui ne sera pas désactivé en phase release, mais bon, on ne peut pas tout avoir
    Try catch désactivé????
    euh la ca m'étonnerai.....

  11. #11
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    as tu activé le rtti dans visual 6???
    je sait plus ou est l'option

  12. #12
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Décembre 2007
    Messages : 17
    Par défaut
    Non, non, je me suis mal exprimé. Je voulais seulement dire qu'en ayant à faire un test avec un try-catch qui n'était pas basé seulement sur une macro de théorie du contrat, on ne pourrait PAS le désactiver en mode release :p

  13. #13
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Décembre 2007
    Messages : 17
    Par défaut
    Nope, je ne l'ai pas activé. En fait, je ne sais mêm pas c'est quoi le rtti. Mais de toute façon, il ne faut pas que la compilation de mon code dépende sur les "settings" de VC++, c'est un plan pour que ça ne compile pas pour le correcteur et qu'il saute immédiatement à la pénalité de 50%...

  14. #14
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Décembre 2007
    Messages : 17
    Par défaut
    Enfin, ne te casse pas la tête à trouver comment changer le rtti. Je peux faire une recherche pour savoir ce qu'est le rtti et franchement, je ne peux pas le changer dans VC++ pour le cours et je doutes d'avoir à me resservir de Visual Studio 6.0 en dehors du contexte de mes cours...

  15. #15
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par LeFredBleu Voir le message
    Enfin, ne te casse pas la tête à trouver comment changer le rtti. Je peux faire une recherche pour savoir ce qu'est le rtti et franchement, je ne peux pas le changer dans VC++ pour le cours et je doutes d'avoir à me resservir de Visual Studio 6.0 en dehors du contexte de mes cours...
    pas si sur il existe encore des projet en visual 6...
    Le rtti c'est ce qui permet de rajouter des choses internes au class avec visual 6....
    ca veut run time et je sais plus
    Malheureusement, sans, typeinfo, dynamic_cast ... ne fonctionneront pas.
    Bon courage.

  16. #16
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Décembre 2007
    Messages : 17
    Par défaut
    Bien merci.

    Finalement, il s'agit plus de problèmes de limitations du cours que de manque de solution. Je n'implanterai probablement cette vérification dans mon travail, mais je retire quand même quelque chose de ce thread

  17. #17
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    J'ai essayer deux second avec visual 6.
    Juste pour info. Ce code compile.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    #include <iostream>
    #include <fstream>
    using namespace std;
     
    void test(std::ostream & os)
    {
        try
            {
            ofstream & osf  = dynamic_cast<ofstream&>(os);
            if (osf.is_open()) std::cout<<"fichier ouvert"<<std::endl;
            else std::cout<<"fichier fermé"<<std::endl;
            }
        catch (...)
            {
                std::cout << "ceci n'est pas un fichier"<<std::endl;
            }
     
    }
     
     
    int main()
    {
        ofstream f("essai.txt");
        test(f);
        f.close();
        test(f);
        test(cout);;
     system("pause");
        return 0;
    }
    Sans le rtti , dynamic_cast<ofstream&> produit toujours une exeption
    Avec rtti. ca marche.
    Par contre je n'ai pas trouvé quoi mettre dans le catch...

  18. #18
    Membre averti
    Inscrit en
    Décembre 2007
    Messages
    17
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Décembre 2007
    Messages : 17
    Par défaut
    Et bien, encore merci.

  19. #19
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    rtti = runtime type information. Désactivé par défaut en VC6.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  20. #20
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 634
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 634
    Par défaut
    Salut,
    Citation Envoyé par Mongaulois Voir le message
    <snip>
    Par contre je n'ai pas trouvé quoi mettre dans le catch...
    L'exception lancée devrait de toutes manière être une dérivée de std::exception, et donc tu peux très bien la récupérer sous cette forme.

    Et, pour être précis et sauf erreur de ma part, l'exception lancée est, tout simplement de type bad_cast

    Cela signifie que le catch devrait prendre la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    catch (std::exception& e)
    {
        /*....*/
    }
    ou de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    catch(std::bad_cast& e)
    {
     
    }
    [EDIT]la première nécessitant l'inclusion du fichier <exception> et la seconde nécessitant l'inclusion du fichier <typeinfo>
    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

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/05/2015, 21h55
  2. [AC-2000] Vérification si un fichier est ouvert
    Par tibogaet dans le forum VBA Access
    Réponses: 1
    Dernier message: 11/06/2010, 11h06
  3. Verifier qu'un fichier Word est ouvert à partir de VBA Excel
    Par dimitrios dans le forum Macros et VBA Excel
    Réponses: 16
    Dernier message: 07/01/2009, 17h37
  4. Macro dans excel permettant de voir si un fichier est ouvert
    Par VirginieGE dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 12/08/2004, 07h51
  5. [VB6] Savoir depuis VB, si un document Excel est ouvert
    Par Argonz dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 12/11/2002, 08h16

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