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 :

Ecriture/Lecture d'un fichier binaire avec vector


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 51
    Par défaut Ecriture/Lecture d'un fichier binaire avec vector
    Bonsoir,
    je cherche désespérément à pouvoir écrire dans un fichier binaire (pour empêcher une édition trop simple)
    les informations d'une tilemap qui se trouvent dans un struct.

    Voici la structure:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    struct dataMap{
    	unsigned int mapX;
    	unsigned int mapY;
     
    	vector<vector<int>> dataTexture1;
    	vector<vector<int>> dataTexture2;
    	vector<vector<int>> dataCollision;
    	vector<vector<int>> dataEvent;
    };
    L'idée c'est que puisse définir la largeur et la hauteur de ma carte puis de définir les données de chaque tile
    dans un fichier texte. Cette étape est faite et fonctionne. Maintenant je n'arrive pas écrire dans le fichier binaire
    toute les informations puisque j'ai des tableaux dynamiques et encore moins à lire le fichier pour retrouver mon
    dataMap.

    Merci d'avance !

  2. #2
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 034
    Billets dans le blog
    12
    Par défaut
    Salut!
    Des vector de vector? Tu t'amuses bien toi!
    As-tu regardé du côté de Boost.Serialize pour ton problème?
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 51
    Par défaut
    J'utilise un vector de vector pour les deux dimensions (ça va simplifier mon code par la suite). Oui j'ai regardé un peu la sérialisation
    mais à vrai dire je n'es pas vraiment compris le principe et la syntaxe. Est-ce que la sérialisation est la seul solution ?
    Même si j'ai bien vu que l'utilisation de plusieurs vecteurs de vecteurs dans un même struct compliquait les choses ^^

  4. #4
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Billets dans le blog
    21
    Par défaut
    Je ne suis pas sûr que d'avoir des vectors de vectors simplifie réellement ton code mais bon, il n'y a rien d'interdit!

    Quelles sont exactement les difficultés que tu rencontres pour écrire dans le fichier binaire? Je ne vois pas de rapport immédiat avec la question de l'allocation dynamique de la mémoire...

    Pour faire très simple, je verrais le schéma suivant:

    - un en-tête qui donnerait le nombre d'enregistrements,
    - chaque enregistrement commencerait par les 2*sizeof(size_t) octets contenant les dimensions du vecteur² à allouer,
    - puis viendraient les données elles-mêmes.

    Pour copier un vecteur d'int, c'est assez facile: fs.write( (char*) vec.data(), vec.size()*sizeof(int) );Copier un vecteur de vecteurs, là, c'est plus pénible parce qu'il faut répéter l'opération vec.size() fois.

    Pour la lecture, c'est à peu près la même chose à l'envers, mais il ne faut pas oublier d'allouer d'abord de la mémoire dans le vecteur de destination: vec v(size); fs.read(vec.data(), size*sizeof(int));Attention à bien utiliser RVO / move semantic / emplace_back pour éviter de faire trop de copies de tes données...

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    Billets dans le blog
    4
    Par défaut
    Déjà, oublie les vector de vector, c'est inutilement compliqué contrairement à ce qu'on peut croire http://cpp.developpez.com/faq/cpp/?p...au-de-tableaux

    Citation Envoyé par herotom99 Voir le message
    Oui j'ai regardé un peu la sérialisation
    mais à vrai dire je n'es pas vraiment compris le principe et la syntaxe. Est-ce que la sérialisation est la seul solution ?
    Ben écrire dans un fichier ça s'appelle sérialiser à vrai dire.
    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.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 51
    Par défaut
    Hum je veux bien utiliser des tableaux à deux dimensions classique mais le problème c'est que la taille de ma carte (XY)
    n'est défini que par l'utilisateur donc je n'es aucun moyen de connaître la taille de mon tableau pour la lecture du fichier :/

    Parce qu'au final, j'ai bien plusieurs tableaux dans un struct mais je dois pouvoir les déclarer sans connaître leur taille final... (d'où les vector).
    Donc déjà ça pose un problème.

    Ensuite, imaginons que j'ai réussi à définir la taille des tableaux que je voulais. Lorsque je vais vouloir lire mon fichier binaire pour retrouver mes tableaux
    je ne vais pas pouvoir puisque la taille du tableau dépend de l'utilisateur... C'est pour ça que j'avais mis appart la taille X et Y de ma map dans le struct.
    Sauf que lorsque je lis le fichier je lis toute la structure en même temps ! Donc je ne vois pas comment faire.

    Peut être faire deux fichiers avec l'un qui contient les tailles et un autres les valeurs ? mais c'est pas pratique ...

    mais sinon je suis bien d'accord qu'utiliser un vector de vector ça devient lourd :p

  7. #7
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Billets dans le blog
    21
    Par défaut
    Utiliser des vectors c'est très bien. Des vectors imbriqués, c'est moins bien. Il suffit d'une fonction pour transformer l'adressage 2D en adressage 1D.
    Boost::serialize permet de sauvegarder des vectors dans des archives sans grande difficulté.
    Sinon, et c'est ce que je te proposais, place en début d'enregistrement sur 2*sizeof(size_t) octets les dimensions du tabeau, avant les données du vecteur elles-mêmes. Tu lis les dimensions, tu crées un vecteur de lignes*colonnes éléments pour réserver la mémoire et tu copies dedans les lignes*colonnes*sizeof(int) octets suivants du fichier.

  8. #8
    Expert confirmé

    Avatar de dragonjoker59
    Homme Profil pro
    Software Developer
    Inscrit en
    Juin 2005
    Messages
    2 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Software Developer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2005
    Messages : 2 034
    Billets dans le blog
    12
    Par défaut
    stendhal666 t'a donné la marche à suivre pour l'écriture et la récupération.
    Ensuite, personne n'a parlé d'utiliser des tableaux à 2 dimensions classiques, mais bien de remplacer tes vector< vector< truc > > par des vector< truc >
    Si vous ne trouvez plus rien, cherchez autre chose...

    Vous trouverez ici des tutoriels OpenGL moderne.
    Mon moteur 3D: Castor 3D, presque utilisable (venez participer, il y a de la place)!
    Un projet qui ne sert à rien, mais qu'il est joli (des fois) : ProceduralGenerator (Génération procédurale d'images, et post-processing).

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

Discussions similaires

  1. Lecture de fichiers binaire avec Get
    Par NVCfrm dans le forum Contribuez
    Réponses: 0
    Dernier message: 26/07/2013, 03h42
  2. Réponses: 5
    Dernier message: 05/08/2011, 11h36
  3. Réponses: 4
    Dernier message: 25/05/2011, 15h38
  4. Réponses: 2
    Dernier message: 01/03/2010, 12h50
  5. Lecture fichier binaire avec fLit
    Par kinouseb dans le forum WinDev
    Réponses: 4
    Dernier message: 06/07/2007, 23h24

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