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

Langage C++ Discussion :

ofstream flag en dynamyque


Sujet :

Langage C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 4
    Par défaut ofstream flag en dynamyque
    Bonjour,
    lors de la création d'un flux de sortie vers un fichier texte :
    ofstream flux_sortie (fileOutPath.c_str() , ios::app);

    je voudrais pouvoir définir le flag ios::app ou ios::trunc (ou autre) de façon dynamique... est-ce possible ?... est ce que l'on peut le passer sous forme de variable ?
    Merci pour votre aide !

  2. #2
    Membre éprouvé Avatar de nowahn
    Homme Profil pro
    Inscrit en
    Août 2008
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 84
    Par défaut
    Bonjour,

    Je ne connais pas d’autres moyens que de fermer le fichier et de le réouvrir avec la nouvelle option :
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ostream flux_sortie(fileOutPath.c_str(), ios::app);
    // utilisation de flux_sortie
    // ...
    flux_sortie.close();
    flux_sortie.open(fileOutPath.c_str(), ios::trunc);
    // ...
    Bien sûr, les données sur la position courante sont perdues au passage

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 4
    Par défaut
    Merci pour ta réponse... il n'y a donc que l'option des if() pour choisir le mode d'ouverture en fonction d'une autre valeur !

  4. #4
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Le type du paramètre pour lequel tu passes std::ios::app est std::ios_base::openmode

    MAT.

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

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    pourrais tu préciser un peu ton souhait

    Si l'idée est de changer le flag alors que le fichier est déjà ouvert, cela n'a pas vraiment de sens:
    1. Certains drapeaux déterminent la position à laquelle on place le "curseur" sur le flux à l'ouverture (app, ate et trunk): une fois le fichier ouvert, il n'y a pas vraiment d'intérêt à les changer
    2. D'autres détermine le sens du flux (in et out): vouloir changer un ostream en istream n'a aucun sens
    3. Le dernier, enfin (binary) permet d'obtenir le flux en "mode binaire" (le mal nommé), et, si tu te trouves dans une situation dans laquelle le flux doit, effectivement, être considéré comme étant en mode binaire, autant directement le considérer comme tel
    Maintenant, il faut savoir que ces drapeaux ne sont jamais que des valeurs énumérées et que les opérateurs logiques (AND, OR, INVERT, XOR) binaires ont été définis pour ces valeurs.

    Si l'idée est de choisir les drapeaux en fonction d'informations obtenues "par ailleurs", il n'y a strictement aucun problème:

    Comme Mat007 l'a si bien fait remarquer, le type (pleinement qualifié) des drapeaux est std::ios_base::openmode. (l'énumération s'appelle openmode et se trouve dans l'espace de noms "ios_base" qui se trouve lui-même imbriqué, comme tout ce qui est fourni par le standard, dans l'espace de noms std).

    Tu pourrais donc parfaitement envisager d'avoir recours à une fonction proche de
    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
    31
    32
    void foo(/* paramètres éventuels */)
    {
        std::ios_base::openmode mode=std::ios_base::out;
        if( /*conditon demandant d'utiliser le mode binaire */)
        {
            mode |=std::ios_base::binary;
        }
        if(/* condition demandant de se placer en fin de fichier */)
        {
            mode |=std::ios_base::ate;
        }
        else if (/* condition demandant de considérer le flux comme vide */)
        {
            /* cette possibilité n'est clairement pas compatible avec la 
             * possibilité précédente... c'est pourquoi je place ceci
             * dans un else if ;)
             */
            mode |=std::ios_base::trunk;
        }
        else if (/* condition demandant de considérer le flux comme vide */)
        {
            /* cette possibilité n'est clairement pas compatible avec la 
             * possibilité précédente... c'est pourquoi je place ceci
             * dans un else if ;)
             */
            mode |=std::ios_base::trunk;
        }
        /*...*/
        /* ouverture d'un fichier dans le mode que l'on vient de déterminer */
        std::ofstream ofs(name.c_str(),mode);
        /*...*/
    }
    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

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2010
    Messages : 4
    Par défaut
    Bonjour,
    merci les infos et pour l'exemple de code !
    Cordialement

Discussions similaires

  1. [langage] Flags et listes
    Par claire14pb dans le forum Langage
    Réponses: 22
    Dernier message: 23/05/2005, 22h54
  2. pb avec mon ofstream
    Par salseropom dans le forum SL & STL
    Réponses: 1
    Dernier message: 17/03/2005, 13h40
  3. ofstream et le mode exclusif
    Par Troll dans le forum SL & STL
    Réponses: 6
    Dernier message: 02/03/2005, 17h18
  4. [flux] héritage combiné d'ifstream et d'ofstream
    Par suizokukan dans le forum SL & STL
    Réponses: 5
    Dernier message: 08/11/2004, 17h09
  5. Flags ??
    Par foussa dans le forum Assembleur
    Réponses: 21
    Dernier message: 19/10/2002, 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