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 :

WxWidgets avec fichier


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 2010
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 115
    Par défaut WxWidgets avec fichier
    bonjour, je n'arrive pas à résoudre un problème concernant la récupération de données à partir d'un fichier.

    Le fichier cercles.cir contient un exemple de fichier texte contenant des cercles.
    Il est écrit dans le format que j'ai choisi pour sauvegarder des fichiers.

    Ce format est constitué d’une première ligne contenant un entier n représentant le nombre de
    cercles contenus dans le fichier.
    Puis, après une ligne vide, viennent n blocs de données contenant chacun 3 lignes :

    – la première contient 3 entiers correspondant aux coordonnées 2D du centre du cercle et de
    son rayon : xyr
    – la seconde contient 4 entiers compris entre 0 et 255 qui correspondent à la couleur de l’intérieur
    du cercle au format RGBA.
    – la troisième contient un entier représentant l’épaisseur de trait du bord du cercle.

    Voici le fichier en question:
    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
     
    4
     
    -208 158 86
    0 255 0 255
    5
     
    -153 111 117
    0 0 255 128
    2
     
    253 -59 147
    255 0 0 128
    2
     
    -96 -56 230
    255 0 0 128
    2
    j'essaye de récuperer ces donnée dans un vecteur que j'ai nommé_tab_circle.

    Voici la classe Mainframe:
    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 MainFrame: public wxFrame {
    public:
      //Constructeur & Destrucuteur
      MainFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
      ~MainFrame();
     
      void onInit();
     
    private:
     
      bool is_drawing;
      int _num_circle;
      std::vector<Circle> _tab_circle;
    DECLARE_EVENT_TABLE();
    }; //MainFrame
    Voici la class circle:
    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
     
    #ifndef CIRCLE_H
    #define CIRCLE_H
     
    #include <wx/wx.h>
     
    class Circle {
     
    public:
    	Circle();
    	Circle(wxPoint center, int radius, wxColor colour, int thickness);
    	Circle(Circle& t);
     
    	~Circle();
     
    	void setCenter(const wxPoint& val)		{ _center = val; }
    	wxPoint center() const					{ return _center; }
     
    	void setRadius(int val)				{ _radius = val; }
    	int radius() const					{ return _radius; }
     
    	void setColour(const wxColor& val)	{ _colour = val; }
    	wxColor colour() const				{ return _colour; }
     
    	void setThickness(int val)			{ _thickness = val; }
    	int thickness() const				{ return _thickness; }
     
    	Circle& operator=(const Circle &t);
     
    protected:
    	wxPoint _center;
    	int _radius;
     
    	wxColor _colour;
     
    	int _thickness;
    };
     
    #endif
    Voici le fichier circle.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
    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
     
    #include "circle.h"
     
    #include <wx/listimpl.cpp>
    WX_DEFINE_LIST(CircleList);
     
    Circle::Circle()
    {
    }
     
    Circle::Circle(wxPoint center, int radius, wxColor colour, int thickness)
    {
    	_center = center;
    	_radius = radius;
     
    	_colour = colour;
    	_thickness = thickness;
    }
     
    Circle::Circle(Circle& t)
    {
    	_center = t.center();
    	_radius = t.radius();
     
    	_colour = t.colour();
     
    	_thickness = t.thickness();
    }
     
    Circle::~Circle()
    {
    }
     
    Circle& Circle::operator=(const Circle &t)
    {
    	if(&t != this) {
    		_center = t.center();
    		_radius = t.radius();
     
    		_colour = t.colour();
     
    		_thickness = t.thickness();
    	}
     
    	return *this;
    }
    Voici la fonction dans laquelle on vas commencer a extraire les données:
    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
     
    void MainFrame::OnOpen( wxCommandEvent& event )
    {
      int red, green, blue,cyan; 
      int i = 0;
      wxFileDialog filedialog ( this, wxT("Open"), wxT("./save/"), wxEmptyString, wxT("*"),wxOPEN, wxDefaultPosition );
      filedialog.ShowModal();
      Circle mycircle;
     
      // Ouvre le fichier
      wxFileInputStream file ( filedialog.GetPath ( ) ) ;
      // Test si l’ouverture a reussi
      if (file .IsOk( )) 
      {
        // Transforme le fichier en un flux de texte
        wxTextInputStream in (file) ;
        // Ici les commandes pour lire
     
        // on veut lire une donnéé du flux in, et qu’on veut la ranger dans _num_circle
        in >> _num_circle ;
        if( _num_circle > 0)
        {
    		GetMenuBar()->Enable( OPTION_CERCLE, TRUE);
     
    		for( i = 0 ; i < _num_circle; i++)
    		{    
    		    in >> mycircle._center.x >> mycircle._center.y >> mycircle._radius;
    		    in >> red >> green >> blue >> cyan;
    		    mycircle._colour = wxColour( red, green, blue, cyan );
    		    in >> mycircle._thickness;
    		    _tab_circle.push_back(mycircle);
    		}
    		Refresh();
        }
     
     
      } 
      else 
      {
        // if open file failed , show an error message box
        wxString errormsg, caption;
        errormsg.Printf(wxT("Unable to open file "));
        errormsg.Append(filedialog.GetPath());
        caption.Printf(wxT("Erreur"));
        wxMessageDialog msg( this, errormsg, caption, wxOK | wxCENTRE | wxICON_ERROR );
        msg.ShowModal();
        return ;
      }
     
     
    }
    quand j'essaye de compiler le programme ,j'ai des erreurs :
    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
     
    circle.h: In member function ‘void MainFrame::OnOpen(wxCommandEvent&)’:
    circle.h:31: error: ‘wxPoint Circle::_center’ is protected
    mainframe.cpp:144: error: within this context
    circle.h:31: error: ‘wxPoint Circle::_center’ is protected
    mainframe.cpp:144: error: within this context
    circle.h:32: error: ‘int Circle::_radius’ is protected
    mainframe.cpp:144: error: within this context
    circle.h:34: error: ‘wxColour Circle::_colour’ is protected
    mainframe.cpp:146: error: within this context
    circle.h:36: error: ‘int Circle::_thickness’ is protected
    mainframe.cpp:147: error: within this context
    In file included from /usr/include/c++/4.4/i486-linux-gnu/bits/c++allocator.h:34,
                     from /usr/include/c++/4.4/bits/allocator.h:48,
                     from /usr/include/c++/4.4/string:43,
                     from /usr/include/wx-2.8/wx/string.h:176,
                     from /usr/include/wx-2.8/wx/memory.h:16,
                     from /usr/include/wx-2.8/wx/object.h:20,
                     from /usr/include/wx-2.8/wx/wx.h:16,
                     from mainframe.cpp:3:
    /usr/include/c++/4.4/ext/new_allocator.h: In member function ‘void __gnu_cxx::new_allocator<_Tp>::construct(_Tp*, const _Tp&) [with _Tp = Circle]’:
    /usr/include/c++/4.4/bits/stl_vector.h:737:   instantiated from ‘void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = Circle, _Alloc = std::allocator<Circle>]’
    mainframe.cpp:148:   instantiated from here
    /usr/include/c++/4.4/ext/new_allocator.h:105: error: no matching function for call to ‘Circle::Circle(const Circle&)’
    circle.h:12: note: candidates are: Circle::Circle(Circle&)
    circle.h:11: note:                 Circle::Circle(wxPoint, int, wxColour, int)
    circle.h:10: note:                 Circle::Circle()
    In file included from /usr/include/c++/4.4/vector:69,
                     from mainframe.cpp:6:
    /usr/include/c++/4.4/bits/vector.tcc: In member function ‘void std::vector<_Tp, _Alloc>::_M_insert_aux(__gnu_cxx::__normal_iterator<typename std::_Vector_base<_Tp, _Alloc>::_Tp_alloc_type::pointer, std::vector<_Tp, _Alloc> >, const _Tp&) [with _Tp = Circle, _Alloc = std::allocator<Circle>]’:
    /usr/include/c++/4.4/bits/stl_vector.h:741:   instantiated from ‘void std::vector<_Tp, _Alloc>::push_back(const _Tp&) [with _Tp = Circle, _Alloc = std::allocator<Circle>]’
    mainframe.cpp:148:   instantiated from here
    /usr/include/c++/4.4/bits/vector.tcc:306: error: no matching function for call to ‘Circle::Circle(const Circle&)’
    circle.h:12: note: candidates are: Circle::Circle(Circle&)
    circle.h:11: note:                 Circle::Circle(wxPoint, int, wxColour, int)
    circle.h:10: note:                 Circle::Circle()
    make: *** [mainframe.o] Erreur 1
    Pouvez vous me dire où se trouve mon erreur?

    Merci de votre compréhension.

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Il y a plusieurs erreurs :

    1) au lieu d'accéder directement à _radius, ... il faut que tu utilises les méthodes prévues à cet effet (setRadius(), ...). Il faut donc passer par des variables intermédiaires :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    in >> mycircle._center.x >> mycircle._center.y >> mycircle._radius;
    devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    wxPoint tcenter;
    int tradius;
    in >> tcenter.x >> tcenter.y >> tradius;
    mycircle.setCenter(tcenter);
    mycircle.setRadius(tradius);
    Même chose pour le reste.

    2) le constructeur par copie de Circle est mal défini :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    class Circle
    { 
     ...
     Circle(const Circle& t); // le const n'est pas présent dans ton code
    };
    
    Circle::Circle(const Circle& t) // le const n'est pas présent dans ton code
    {... }
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    115
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 115
    Par défaut
    c'est exactement ça , merci encore de ton aide Emmanuel

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

Discussions similaires

  1. Mettre a jour BD avec fichier csv
    Par Looping94510 dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 07/02/2005, 18h56
  2. Erreur avec fichier .manifest
    Par engi dans le forum Windows
    Réponses: 2
    Dernier message: 16/11/2004, 14h58
  3. [Eclipe 2.1.1]Projet avec fichiers sources existants
    Par mfofana dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 26/02/2004, 05h20
  4. Problème avec fichier texte
    Par jpdelx dans le forum ASP
    Réponses: 7
    Dernier message: 13/11/2003, 13h17
  5. Réponses: 4
    Dernier message: 25/08/2003, 09h02

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