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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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

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