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 :

Problème lecture sur fichier d'objets dynamiques


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    A_B
    A_B est déconnecté
    Membre confirmé Avatar de A_B
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 153
    Par défaut Problème lecture sur fichier d'objets dynamiques
    Bonjour,
    Depuis un moment j essaye d'effectuer une lecture sur un fichier mais je rencontre toujours une erreur .
    En fait jai un objet qui contient un tableau dynamique .
    Donc un pointeur, et dans les methodes je le construit en fonction de la taille demandée qui est a son tour un attribut de la meme classe .

    Le probleme c'est que pour lire ce genre de structure il faut bien donner a la fonction file.read un parametre adresse dobjet, dans lequel on effectuera la copie .

    Comment fonctionne cette instruction Fread ? Et comment il pourra faire la lecture sachant que la taille de lobjet sur le fichier est inconnu a cause du tableau dynamique qu il contient ?

    Merci

  2. #2
    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,

    La gestion des tableaux créés dynamiquement est - à n'en pas douter - l'un des cas les plus "peau de banane" que l'on puisse rencontrer en C et en C++...

    C'est la raison pour laquelle, quand on programme en C++, le premier conseil à donner est de préférer les classes proposées par le standard à toute possibilité issue du C.

    Ainsi, tu aura surement bien plus facile à gérer ta structure si tu remplace le tableau dynamique par un objet de type vector, fourni par le standard dans l'espace de noms std et disponible par inclusion du fichier d'en-tête <vector>.

    De la même manière, et pour la même raison, tu devrais t'intéresser de près aux classes de gestion de fichier ifstream (pour la lecture) et/ou ofstream (pour l'écriture), également disponibles dans l'espace de noms std mais grace à l'inclusion du fichier d'en-tête... <fstream> cette fois.

    Pour le reste, si tu veux une aide plus précise, il serait sympa de ta part de nous fournir un exemple du code que tu as déjà créé, et de nous expliquer clairement le problème auquel tu es confronté...

    Ta question d'origine est effectivement beaucoup trop générale pour que l'on puisse t'apporter une aide efficace
    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

  3. #3
    A_B
    A_B est déconnecté
    Membre confirmé Avatar de A_B
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 153
    Par défaut
    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
    class qcm
    {
    private:
     
     
     
    public:
    	int taille  ;
    	Question *tab_quest;
    	qcm(void);
    	void Create_Data(void);
    	void Save_Data(void);
    	void Load_Data(void);
    	void Set_taille(int a );
    	int Get_taille(void) ;
    public:
    	~qcm(void);
    };
    Voila lobjet en question .
    En fait j'arrive a l'ecrire sur un fichier .
    Mais j arrive pas a le lire en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f.Write(&qcm1,sizeof(qcm));
    Et je demande comment je pourrai faire, pour lire des entites pareilles, quand il ya un tableau dynamique par exemple .
    Sachant qu'on connait pas la taille prealable de l element qu on va lire du fichier !

    Merci

  4. #4
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    regarde du coté de boost:::serialization, ya un tuto ici par JolyLoic.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  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
    Ce qui serait surtout pas mal, c'est d'abandonner l'idée de l'allocation dynamique de la mémoire, et de se diriger vers le conteneur standard qui te semble le plus adapté à ce que tu veux faire...

    Tu remplacerais ainsi avantageusement ton
    par un (par exemple)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<Question> tab_quest;
    qui te permettrait de supprimer le membre
    car disponible via
    De cette manière, lors de la lecture, tu commencerais "simplement" par lire le nombre d'informations à rajouter, et tu ferais une boucle "toute simple" qui pourrait prendre une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    size_t sizeToRead;
    file>>sizeToRead;
    for(size_t i=0;i<sizeToRead;++i)
    {
        std::string answer;
        file>>answer;
        /* vérification éventuelle*/
        tab_quest.push_back(answer);
    }
    Au passage, étant donné qu'il n'y a sans doute pas lieu de modifier les différetes valeurs une fois que ta variable de type qcm a été créée, il semblerait opportun de placer les membres size et tab_quest en accessibilité private: et de fournir des accesseurs constant pour les valeur représentées
    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
    A_B
    A_B est déconnecté
    Membre confirmé Avatar de A_B
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 153
    Par défaut
    Merci pour la solution ;-)

    Mais c'est important pour moi de garder la taille car en fait elle n'est pas fixe, et l'objet est créé avec une taille qui dépend de lutilisateur, donc je pense que c'est important c'est pour cela que j'ai opté pour la solution dynamique .

    Sion
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    size_t sizeToRead;
    file>>sizeToRead;
    for(size_t i=0;i<sizeToRead;++i)
    {
        std::string answer;
        file>>answer;
        /* vérification éventuelle*/
        tab_quest.push_back(answer);
    }
    Sinon pourquoi vous avez choisi string answer .
    Dans mon cas ca ne sera pas un objet de type qustion comme dans ma definition de classe ?

    Merci

Discussions similaires

  1. [Rman]problème écriture sur fichier (linux)
    Par Invité dans le forum Oracle
    Réponses: 20
    Dernier message: 30/08/2006, 05h52
  2. Problème de lecture sur fichier ini.
    Par braoru dans le forum Delphi
    Réponses: 2
    Dernier message: 28/07/2006, 15h34
  3. lecture sur fichier et chaine de caractères
    Par Aethis dans le forum Langage
    Réponses: 3
    Dernier message: 10/07/2006, 11h27

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