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 ios_base dans une fonction qui renvoie un fichier.


Sujet :

C++

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 61
    Points : 43
    Points
    43
    Par défaut erreur ios_base dans une fonction qui renvoie un fichier.
    Bonjour, en compilant mon projet sous code::block, je reçois un message d'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fonction.cpp|31|note: synthesized method ‘std::basic_ofstream<char, std::char_traits<char> >::basic_ofstream(const std::basic_ofstream<char, std::char_traits<char> >&)’ first required here |
    Voici mon 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
     
    #include <string>
    #include <fstream>
    #include <iostream>
    #include <sstream>
    #include <set>
    #include <numeric>
    #include <exception>
    #include <map>
    #include <math.h>
     
    #include "EcrireSequence.h"
     
    std::ofstream fichier ("Sequence_Binaire", std::ios::out | std::ios::trunc);
    std::ofstream EcireSequence (std::map<std::string, std::map<std::string, int> > &maMatriceFinale)
    {
     
     
        for( std::map<std::string, std::map<std::string, int> >::iterator it1 = maMatriceFinale.begin(); it1!= maMatriceFinale.end(); ++it1){
     
     
                std::map<std::string, int>::iterator it2 = it1->second.begin(); it2 != it1->second.end(); ++it2;
                fichier << ">" << it1->first << '\n';
     
                    for(it2 = it1->second.begin(); it2 != it1->second.end(); ++it2)
                        fichier << it2->second ;
                        fichier << std::endl;
                        //FILE << it1->second.size()<< endl;
                        fichier << std::endl;
     
        }
        return(fichier);
     
    }
    Dans le fichier ios_base.h j'ai aussi cette ligne qui est indiquée par le message d'erreur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     // _GLIBCXX_RESOLVE_LIB_DEFECTS
      // 50.  Copy constructor and assignment operator of ios_base
      private:
        ios_base(const ios_base&);
    Quelqu'un saurait où se trouve le souci?
    Merci d'avance.

  2. #2
    Membre averti Avatar de vikki
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    292
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 292
    Points : 302
    Points
    302
    Par défaut
    Salut,
    La classe ios_base n'est pas copiable (constructeur par copie et operateur de copie privés), et par consequence toutes les classes en heritant (dont ofstream ) ne le sont pas. Or, la fonction EcireSequence renvoie une copie de la variable fichier utilisée dans celle-ci. Le plus simple est de prendre en parametre de la fonction une référence non constante sur un std::ofstream que tu manipule ensuite au sein de la fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void EcireSequence (std::map<std::string, std::map<std::string, int> > &maMatriceFinale, std::ofstream & fichier)

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

    Informations forums :
    Inscription : Avril 2010
    Messages : 61
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par vikki Voir le message
    Salut,
    La classe ios_base n'est pas copiable (constructeur par copie et operateur de copie privés), et par consequence toutes les classes en heritant (dont ofstream ) ne le sont pas. Or, la fonction EcireSequence renvoie une copie de la variable fichier utilisée dans celle-ci. Le plus simple est de prendre en parametre de la fonction une référence non constante sur un std::ofstream que tu manipule ensuite au sein de la fonction:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void EcireSequence (std::map<std::string, std::map<std::string, int> > &maMatriceFinale, std::ofstream & fichier)
    Ok ça marche, et ça m'as fait disparaitre mon message d'erreur.
    Cependant, j'ai un souci car mon fichier de sortie est vide (les instructions écrire) ne fonctionnent pas. Alors qu'un faisant un std::cout, les éléments à écrire s'affichent bien au fur et à mesure.

    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
     
    #include <string>
    #include <fstream>
    #include <iostream>
    #include <sstream>
    #include <set>
    #include <numeric>
    #include <exception>
    #include <map>
    #include <math.h>
     
    #include "EcrireSequence.h"
     
    std::ofstream fichier ("Fichier_Final", std::ios::out | std::ios::trunc);
    void EcireSequence (std::ofstream &fichier, std::map<std::string, std::map<std::string, int> > &maMatriceFinale)
    //void EcireSequence (std::string nomfichier, std::map<std::string, std::map<std::string, int> > &maMatriceFinale)
    {
        for( std::map<std::string, std::map<std::string, int> >::iterator it1 = maMatriceFinale.begin(); it1!= maMatriceFinale.end(); ++it1){
     
     
                std::map<std::string, int>::iterator it2 = it1->second.begin(); it2 != it1->second.end(); ++it2;
                fichier << ">" << it1->first << '\n';
                // std::cout << ">" << it1->first << '\n';
     
                    for(it2 = it1->second.begin(); it2 != it1->second.end(); ++it2)
                        fichier << it2->second ;
                        fichier << std::endl;
                        //FILE << it1->second.size()<< endl;
                        fichier << std::endl;
     
                        //std::cout << "monit.second"<< it2->second ;
                        //FILE << it1->second.size()<< endl;
                        //std::cout << std::endl;
     
     
     
     
        }
     
    }
    Et la manière dont j'appelle ma fonction dans mon main.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    std::ofstream fichier ("MonFichier", std::ios::out | std::ios::trunc);
     
    EcireSequence(fichier, maMatriceFinale);
    Merci d'avance.

  4. #4
    Membre averti Avatar de vikki
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    292
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Mai 2007
    Messages : 292
    Points : 302
    Points
    302
    Par défaut
    As tu vérifie le contenu du fichier après être sorti du main? Normalement le contenu du fichier est visible après la fermeture du std::ofstream (fonction close() appelée dans le destructeur)

    EDIT: à quoi sert la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::ofstream fichier ("Fichier_Final", std::ios::out | std::ios::trunc);
    ?

Discussions similaires

  1. Erreur Mismatch dans une fonction qui rempli une liste déroulante
    Par MisNiak dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 24/12/2008, 17h11
  2. Réponses: 1
    Dernier message: 23/10/2007, 09h37
  3. [VBA][03] Erreur dans une fonction qui vide des tables
    Par NiKoTiNe dans le forum VBA Access
    Réponses: 3
    Dernier message: 20/04/2007, 14h13
  4. [9i] PLS-00320 avec une fonction qui renvoi un curseur
    Par hoaxpunk dans le forum Oracle
    Réponses: 5
    Dernier message: 09/02/2006, 17h04
  5. [VB6] Comment faire une fonction qui renvoie 2 résultats
    Par tazarine dans le forum VB 6 et antérieur
    Réponses: 10
    Dernier message: 15/01/2004, 00h13

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