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 :

Probleme ouverture fichier dans une classe


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 79
    Par défaut Probleme ouverture fichier dans une classe
    Bonjour,

    j'ai coder une classe ou j'essaye qui doit ouvrir un fichier avec fstream :
    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
    #include <iostream>
    #include <fstream>
    using namespace std;
     
    namespace libxml
    {
      class xml
      {
      public:
        string XML_VAR_file;
        int XML_VAR_file_id;
        string XML_VAR_query;
        fstream XML_open_file;
     
        xml(string);
        bool XML_query(string);
        ~xml();
      };
     
      xml::xml(string XML_VAR_file)
      {
        xml::XML_VAR_file = XML_VAR_file;
        xml::XML_open_file.open(xml::XML_VAR_file, ios::ate); // LIGNE 23
      }
      bool xml::XML_query(string)
      {
     
      }
      xml::~xml()
      {
        xml::XML_open_file.close();
      }
    }
    Seulement, ça me renvois une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ~/Files/Programmes/Cpp/tests $ g++ libxml.cpp -o libxml
     
    libxml.cpp: In constructor ‘libxml::xml::xml(std::string)’:
    libxml.cpp:23: error: no matching function for call to ‘std::basic_fstream<char,
    std::char_traits<char> >::open(std::string&, const std::_Ios_Openmode&)’
    /usr/include/c++/4.2/fstream:778: note: candidates are: void std::basic_fstream<_CharT, _Traits>::open(const char*, std::_Ios_Openmode) [with _CharT = char, _Traits = std::char_traits<char>]
    Si j'ai bien compris il faut que dans cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xml::XML_open_file.open(xml::XML_VAR_file, ios::ate); // LIGNE 23
    xml::XML_VAR_file soie un pointeur de constante de char ?
    Seulement si je fait un transtypage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xml::XML_open_file.open((const char*)xml::XML_VAR_file, ios::ate);
    Ça m'envoie une autre erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    libxml.cpp: In constructor ‘libxml::xml::xml(std::string)’:
    libxml.cpp:23: error: invalid cast from type ‘std::string’ to type ‘const char*’
    Quelqu'un aurait la solution ?
    Merci

  2. #2
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par theo7 Voir le message
    Si j'ai bien compris il faut que dans cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xml::XML_open_file.open(xml::XML_VAR_file, ios::ate); // LIGNE 23
    xml::XML_VAR_file soie un pointeur de constante de char ?
    Oui tu as bien compris

    La solution consiste à utiliser la fonction membre c_str() de la classe string:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    xml::XML_open_file.open(xml::XML_VAR_file.c_str(), ios::ate);
    Sinon, une remarque en passant: il n'est pas nécessaire de mettre l'opérateur de résolution de portée ( xml:: ) lorsque tu es dans la portée en question. Par exemple, le code précédent peut se simplifier ainsi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XML_open_file.open(XML_VAR_file.c_str(), ios::ate);
    Maintenant, peut-être que tu préfères avec.

    Autre chose: il est dangereux d'utiliser un "using namespace" dans un header et dans l'espace de nommage global.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 79
    Par défaut
    Ça marche, merci

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 79
    Par défaut
    En faite ça marche qu'a "moitié" :

    Avec ce code, tout vas bien, sauf que je peut pas utiliser XML_file dans d'autres méthodes de la classe :
    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
    class xml
      {
      public:
        string XML_VAR_file;
        string XML_VAR_query;
     
        xml(string XML_VAR_file)
        {
          fstream XML_file;
          XML_VAR_file = XML_VAR_file;
          XML_file.open(XML_VAR_file.c_str(), ios::app);
     
          cout << "open file : " << XML_VAR_file <<endl;
        }
    //[...]
      }
    sinon j'ai l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ‘XML_file’ was not declared in this scope
    Et si je déclare XML_file comme ceci :
    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
    class xml
      { // ligne 4
      public:
        string XML_VAR_file;
        string XML_VAR_query;
        fstream XML_file;
     
        xml(string XML_VAR_file)
        {
          XML_VAR_file = XML_VAR_file;
          XML_file.open(XML_VAR_file.c_str(), ios::app);
     
          cout << "open file : " << XML_VAR_file <<endl;
        }
    //[...]
      }
    Ça me renvois un gros paquet d'erreurs incompréhensible pour moi :
    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
    /home/theo7/Files/Programmes/Cpp/tests $ g++ main.cpp -o main
    /usr/include/c++/4.2/bits/ios_base.h: In copy constructor ‘std::basic_ios<char, std::char_traits<char> >::basic_ios(const std::basic_ios<char, std::char_traits<char> >&)’:
    /usr/include/c++/4.2/bits/ios_base.h:779: error: ‘std::ios_base::ios_base(const std::ios_base&)’ is private
    /usr/include/c++/4.2/iosfwd:55: error: within this context
    /usr/include/c++/4.2/iosfwd: In copy constructor ‘std::basic_fstream<char, std::char_traits<char> >::basic_fstream(const std::basic_fstream<char, std::char_traits<char> >&)’:
    /usr/include/c++/4.2/iosfwd:95: note: synthesized method ‘std::basic_ios<char, std::char_traits<char> >::basic_ios(const std::basic_ios<char, std::char_traits<char> >&)’ first required here 
    /usr/include/c++/4.2/streambuf: In copy constructor ‘std::basic_filebuf<char, std::char_traits<char> >::basic_filebuf(const std::basic_filebuf<char, std::char_traits<char> >&)’:
    /usr/include/c++/4.2/streambuf:794: error: ‘std::basic_streambuf<_CharT, _Traits>::basic_streambuf(const std::basic_streambuf<_CharT, _Traits>&) [with _CharT = char, _Traits = std::char_traits<char>]’ is private
    /usr/include/c++/4.2/iosfwd:86: error: within this context
    /usr/include/c++/4.2/iosfwd: In copy constructor ‘std::basic_fstream<char, std::char_traits<char> >::basic_fstream(const std::basic_fstream<char, std::char_traits<char> >&)’:
    /usr/include/c++/4.2/iosfwd:95: note: synthesized method ‘std::basic_filebuf<char, std::char_traits<char> >::basic_filebuf(const std::basic_filebuf<char, std::char_traits<char> >&)’ first required here 
    libxml.cpp: In copy constructor ‘libxml::xml::xml(const libxml::xml&)’:
    libxml.cpp:4: note: synthesized method ‘std::basic_fstream<char, std::char_traits<char> >::basic_fstream(const std::basic_fstream<char, std::char_traits<char> >&)’ first required here 
    main.cpp: In function ‘int main(int, char**)’:
    main.cpp:13: note: synthesized method ‘libxml::xml::xml(const libxml::xml&)’ first required here
    Mon main.cpp :
    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
    #include <iostream>
    #include <fstream>
    #include <boost/xpressive/xpressive.hpp>
    using namespace boost::xpressive;
    using namespace std;
    #include "libxml.cpp"
    using namespace libxml;
     
     
    int main(int argc, char* argv[])
    {
     
      xml xmlt = xml("test.xml"); // Ligne 13
     
      return 0;
    }
    Quelqu'un aurait la solution ?
    Merci .

  5. #5
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Bonsoir Theo,

    je te propose de prendre un peu de recul sur le code que tu as écris. Prenons par exemple:
    Citation Envoyé par theo7 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    XML_VAR_file = XML_VAR_file;
    Ceci n'a aucun sens.
    En c++, le signe '=' est utilisé pour affecter une valeur à une variable. Là c'est comme si tu disais "a = a".

    Ensuite, l'erreur:
    XML_file’ was not declared in this scope
    signifie que la variable XML_file n'est pas déclarée dans la portée. C'est un concept "de base" en c++. Par conséquent, je ne pourrais donc te donner de meilleur conseil que de prendre le temps (beaucoup de temps, j'en conviens, malheureusement) de lire les cours et les tutoriaux disponibles sur ce site (et autres), et tu y trouveras les raisons de ces erreurs.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    79
    Détails du profil
    Informations personnelles :
    Âge : 31
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 79
    Par défaut
    Citation Envoyé par r0d Voir le message
    En c++, le signe '=' est utilisé pour affecter une valeur à une variable. Là c'est comme si tu disais "a = a".
    C'etait pour que xml::XML_VAR_file soit egal a l'argument donner a la methode, que je puisse utiliser la variable dans d'autres fonctions de la classe, mais je vais ré-utiliser les xml::, je trouve ça plus lisible
    Ensuite, l'erreur:
    Citation:
    XML_file’ was not declared in this scope
    signifie que la variable XML_file n'est pas déclarée dans la portée.
    J'avais compris
    Mais une variable déclarer juste après class xml{} est accessible dans toutes les methodes non ? Mais lorsque que je déclarais XML_file comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class xml
    {
    public:
      fstream XML_file;
    }
    Sa me mettais un gros bloc d'erreur (je l'ai dit dans ma réponse) .

    Sinon j'ai trouver une solution, déclarer XML_file hors de la classe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      fstream XML_file;
      class xml
      {
      public:
        string XML_VAR_file;
        string XML_VAR_query;
     
     
        xml(string XML_VAR_file);
        {
          xml::XML_VAR_file = XML_VAR_file;
          XML_file.open(XML_VAR_file.c_str(), ios::app);
    //[...]
    Voila, merci

Discussions similaires

  1. Probleme d'initialisation dans une classe
    Par AirSounet dans le forum Débuter
    Réponses: 5
    Dernier message: 27/06/2011, 16h50
  2. probleme avec property dans une class
    Par Dereck07 dans le forum Débuter
    Réponses: 3
    Dernier message: 03/01/2010, 23h07
  3. ouverture fichier dans une boucle
    Par ericdev67 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/04/2008, 18h52
  4. probleme d'image dans une class
    Par jerem721 dans le forum Graphisme
    Réponses: 2
    Dernier message: 30/12/2007, 15h20
  5. [Tableaux] Probleme variable statique dans une classe
    Par Joe Le Mort dans le forum Langage
    Réponses: 7
    Dernier message: 31/08/2006, 11h35

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