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 :

erreur avec ofstream (ios is private)


Sujet :

C++

  1. #1
    Membre régulier
    Homme Profil pro
    retraité développement loisirs
    Inscrit en
    Janvier 2012
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité développement loisirs

    Informations forums :
    Inscription : Janvier 2012
    Messages : 147
    Points : 85
    Points
    85
    Par défaut erreur avec ofstream (ios is private)
    Bonjour à tous,
    pour apprendre les différents modes d'écriture sur un fichier texte, je fait un petit programme avec un switch (lecture, écrasement, ajout, etc... mais il plante.
    si je déclare un ofstream dans une fonction j'ai l'erreur de compilation

    error: 'std::ios_base::ios_base(const std::ios_base&)' is private|
    en fait mon problème est que si je déclare mon ofstream au début du fichier tout va bien mais cela ne me permet pas de choisir le mode d'ouverture avec un switch.
    je suis certain que ma question est idiote mais ca fait des heures que j'essaie de contourner le problème en vain

    merci de votre aide
    Lucky
    voici le code
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    #include <iostream>
    #include<stdlib.h>
    #include <string>
     
    #include <fstream>
     
    using namespace std;
     
    struct Personne {    char nom[32], prenom[32], numero[20];};
    string const lienFichier("F:\\prog\\tutosMateo\\scores.txt");
    //ofstream monFlux(lienFichier.c_str());
    //ofstream monFlux("F:\\prog\\tutosMateo\\scores.txt");
     
    /******************************** FIN DES DECLARATIONS*********************************/
    void remplit(ofstream monFlux){
     
        if(monFlux)// on teste si tout est ok
        {
          monFlux << "Bonjour, je suis une phrase écrite dans un fichier."  << endl;
          monFlux << 42.1337 << endl;
          int age(23);
          monFlux << "J'ai " << age << " ans." << endl;
     
        }
        else{
            cout <<"ERREUR impossible d'ouvrir le fichier"<<endl;
        }
        }
        /********************************************/
    void ecrase(){
        ofstream monFlux(lienFichier.c_str());
        remplit(monFlux);
        }
    /************************/
    void complete(){
        ofstream monFlux(lienFichier.c_str(), ios::app);
        remplit(monFlux);
    }
    int main()
    {
    const int maxAdresses = 50;
    Personne db[maxAdresses];
    int nombreAdresses=0;
    bool fin=false;
    char choix;
     
        do{//pm c'est un do while
            cout << " 1) ouvrir le fichier en ecriture (ecrase)" << endl;
            cout << " 2) ajouter des donnees a la fin (append)" << endl;
            cout << " 3) lire en entier" << endl;
            cout << " 4) lire ligne par ligne" << endl;
            cout << " 5) lire mot par mot" << endl;
            cout << " 6) lire caractere par caractere" << endl;
            cout << "9) Quitter" << endl;
     
            cin >> choix;
     
            switch (choix)
                {
                case '1':   //ouvrir le fichier en ecriture (ecrase)
                    ecrase();
                    break;
                case '2':   //ajouter des donnees a la fin (append)
                    complete();
                    break;
                case '3':   //lire en entier
                    fin=true;
                    break;
                case '4':   //lire ligne par ligne
                    fin=true;
                    break;
                case '5':   //lire mot par mot
                    fin=true;
                    break;
                case '6':   //lire caractere par caractere
                    fin=true;
                    break;
                case '9':   //QUITTER
                    fin=true;
                    break;
     
                }
     
        }while(!fin);
        return 0;
       }

  2. #2
    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
    remplit veut faire une copie du paramètre. Les flux ne sont pas copiables.
    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.

  3. #3
    Membre régulier
    Homme Profil pro
    retraité développement loisirs
    Inscrit en
    Janvier 2012
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité développement loisirs

    Informations forums :
    Inscription : Janvier 2012
    Messages : 147
    Points : 85
    Points
    85
    Par défaut
    merci Bousk pour cette réponse,
    comment puis-je faire pour contourner le problème s'il vous plait ?
    dans un premier temps j'ai supprimé la fonction remplit, mais ca m'oblige à répéter 2 fois la même chose, j'aurai bien voulu pouvoir transmettre le paramètre au lieu de répéter dans chaque fonction
    voici ce que ca donne maintenant (ca marche mais c'est moins joli je trouve)

    merci
    Cordialement
    Lucky
    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
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    #include <iostream>
    #include<stdlib.h>
    #include <string>
     
    #include <fstream>
     
    using namespace std;
     
    struct Personne {    char nom[32], prenom[32], numero[20];};
    string const lienFichier("F:\\prog\\tutosMateo\\scores.txt");
    //ofstream monFlux(lienFichier.c_str());
    //ofstream monFlux("F:\\prog\\tutosMateo\\scores.txt");
     
    /******************************** FIN DES DECLARATIONS*********************************/
    /*void remplit(ofstream monFlux){
     
        if(monFlux)// on teste si tout est ok
        {
          monFlux << "Bonjour, je suis une phrase écrite dans un fichier."  << endl;
          monFlux << 42.1337 << endl;
          int age(23);
          monFlux << "J'ai " << age << " ans." << endl;
     
        }
        else{
            cout <<"ERREUR impossible d'ouvrir le fichier"<<endl;
        }
        }
        /********************************************/
     
    void ecrase(){
        ofstream monFlux(lienFichier.c_str());
        if(monFlux)// on teste si tout est ok
        {
          monFlux << "Bonjour, je suis une phrase écrite dans un fichier."  << endl;
          monFlux << 42.1337 << endl;
          int age(23);
          monFlux << "J'ai " << age << " ans." << endl;
     
        }
        else{
            cout <<"ERREUR impossible d'ouvrir le fichier"<<endl;
        }
        }
        //remplit(monFlux);
    //    }
    /************************/
    void complete(){
        ofstream monFlux(lienFichier.c_str(), ios::app);
        if(monFlux)// on teste si tout est ok
        {
          monFlux << "Bonjour, je suis une phrase écrite dans un fichier."  << endl;
          monFlux << 42.1337 << endl;
          int age(23);
          monFlux << "J'ai " << age << " ans." << endl;
     
        }
        else{
            cout <<"ERREUR impossible d'ouvrir le fichier"<<endl;
        }
        }
        //remplit(monFlux);
    //}
    int main()
    {
    const int maxAdresses = 50;
    Personne db[maxAdresses];
    int nombreAdresses=0;
    bool fin=false;
    char choix;
     
        do{//pm c'est un do while
            cout << " 1) ouvrir le fichier en ecriture (ecrase)" << endl;
            cout << " 2) ajouter des donnees a la fin (append)" << endl;
            cout << " 3) lire en entier" << endl;
            cout << " 4) lire ligne par ligne" << endl;
            cout << " 5) lire mot par mot" << endl;
            cout << " 6) lire caractere par caractere" << endl;
            cout << "9) Quitter" << endl;
     
            cin >> choix;
     
            switch (choix)
                {
                case '1':   //ouvrir le fichier en ecriture (ecrase)
                    ecrase();
                    break;
                case '2':   //ajouter des donnees a la fin (append)
                    complete();
                    break;
                case '3':   //lire en entier
                    fin=true;
                    break;
                case '4':   //lire ligne par ligne
                    fin=true;
                    break;
                case '5':   //lire mot par mot
                    fin=true;
                    break;
                case '6':   //lire caractere par caractere
                    fin=true;
                    break;
                case '9':   //QUITTER
                    fin=true;
                    break;
     
                }
     
        }while(!fin);
        return 0;
       }

  4. #4
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,

    On ne peut pas copier un flux car deux flux sur un même fichier ça ferait un beau bordel. Il suffit donc de référencer le flux. Il manquait donc juste un simple & dans ta ligne 15.
    Et si tu ne sais pas ce qu'est une référence, il te faut voir les bases du langage.

  5. #5
    Membre régulier
    Homme Profil pro
    retraité développement loisirs
    Inscrit en
    Janvier 2012
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité développement loisirs

    Informations forums :
    Inscription : Janvier 2012
    Messages : 147
    Points : 85
    Points
    85
    Par défaut
    merci dalfab,
    super, ca marche.
    Bon, il va falloir que je potasse les bases (et les références de suite), mais c'est bien car justement le but c'est d'apprendre.
    Cool merci à toi encore et à bousk
    Cordialement

  6. #6
    Membre régulier
    Homme Profil pro
    retraité développement loisirs
    Inscrit en
    Janvier 2012
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité développement loisirs

    Informations forums :
    Inscription : Janvier 2012
    Messages : 147
    Points : 85
    Points
    85
    Par défaut
    Bonjour,
    je reviens sur le sujet pour une petite interrogation supplémentaire,
    pour créer la référence vers monFlux, j'ai écrit :
    void remplit(ofstream &refMonFlux)
    et ca marche !
    j'étais content, mais après j'ai vu dans la FAQ https://cpp.developpez.com/faq/cpp/?page=Les-references
    qu'ils avaient écrit
    void swap(int& i, int& j)
    donc j'ai corrigé
    void remplit(ofstream& refMonFlux)
    et ca marche aussi !

    ma question : espace AVANT, espace APRES, les 2 fonctionnent apparemment, c'est important ? c'est grave ?
    Merci de votre aide
    Cordialement
    Lucky

  7. #7
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    L'espace c'est un séparateur aussi bien qu'un retour à la ligne ou un commentaire, il ne porte aucune information en lui-même. Tous les textes suivants sont totalement équivalents :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void remplit(ofstream &refMonFlux);
         void    remplit        (  ofstream &            refMonFlux )   ;
    void remplit(
          ofstream
          &  // <= le & est tout seul sur la ligne (avec le commentaire!)
          refMonFlux  );
    void remplit(ofstream&refMonFlux);
    /*comment*/void/*comment*/remplit/*comment*/(/*comment*/ofstream/*comment*/&/*comment*/refMonFlux/*comment*/)/*comment*/;/*comment*/

  8. #8
    Membre régulier
    Homme Profil pro
    retraité développement loisirs
    Inscrit en
    Janvier 2012
    Messages
    147
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : retraité développement loisirs

    Informations forums :
    Inscription : Janvier 2012
    Messages : 147
    Points : 85
    Points
    85
    Par défaut
    merci Dalfab pour ta réponse précise et documentée.
    sujet résolu
    Cordialement

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

Discussions similaires

  1. Erreur avec : ofstream en paramètre d'une fonction
    Par droledelolo dans le forum C++
    Réponses: 4
    Dernier message: 21/08/2008, 09h04
  2. Problème avec ofstream et ios::app
    Par Clad3 dans le forum SL & STL
    Réponses: 8
    Dernier message: 07/01/2007, 12h10
  3. [Débutant][Conception] Erreur avec une classe interne
    Par Devil Redneck dans le forum Général Java
    Réponses: 5
    Dernier message: 11/06/2004, 15h45
  4. Erreur avec les ADO
    Par megane dans le forum Bases de données
    Réponses: 7
    Dernier message: 08/03/2004, 21h37
  5. Erreur avec WM_COMMAND (BN_CLICKED)
    Par cyberlewis dans le forum Windows
    Réponses: 2
    Dernier message: 09/02/2004, 00h25

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