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 :

Manipulation d'un fichier de donnees


Sujet :

C++

  1. #1
    Membre régulier
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Points : 83
    Points
    83
    Par défaut Manipulation d'un fichier de donnees
    Bonjour,

    je voudrais modifier l'ordre de données contenues dans fichier .ppm (fichier image contenant des pixels).

    Il faut une méthode pour que le nombre de colonnes devienne le nombre de lignes et vice-verca.

    exemple d'un fichier original:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    P3
    4 1 
    255
    10 11 12  20 21 22  30 31 32  40 41 42
    4 représente le nombre de colonnes et 1 représente le nombre de lignes
    fichier après rotation (255 le nombre de pixels maximum)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    P3
    1 4
    255
    10 11 12 
    20 21 22 
    30 31 32 
    40 41 42
    remarquez que c'est l'inverse qui devra se produire

    quelle est la procédure a suivre pour que ce changement de colonnes se fasse pour n'importe quel fichier donnée ? que faudra-t-il utiliser ?

    j'ai écris la fonction de lecture qui récupère les 3 premières valeures dans une structure, et enregistre le contenu dans un vecteur.

    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
    PPM_Primitive *read_PPM(string fn){
          PPM_Primitive p;
          vector <string> lines(0);
          ifstream infile (fn.c_str());
          string s;
          int i;
     
          if (infile.is_open()){
              infile >> p.p3 >> p.rows >> p.cols >> p.maxpixel;
                 if (p.p3=="p3" || p.p3 =="P3"){
                    while (!infile.eof()) {
                    getline(infile, s);
                    if (!infile.fail()) lines.push_back(s);
                    }
     
                 cerr << "p3: "<< p.p3<< "\nrows: " << p.rows << "\ncols: "<< p.cols << "\nmaxpixel: "<< p.maxpixel<<"\n";
     
                 for (i = 0; i <= lines.size()-1; i++) {
                     cout << lines[i] << endl;
                     }
                  } else cerr <<"Bad PPM file - first word is not P3\n";
          }
          else cerr << "Couldn't open " << fn << ".\n";
    }
    mon probleme reside dans comment je pourrais manipuler les informations dans ce vecteur.

    Merci.

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    A priori, je dirais que tu a besoin de parser chaque ligne lue pour en extraire les différents éléments et donc obtenir un vecteur de vecteur de triplet (si j'ai bien compris).

  3. #3
    Membre régulier
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Points : 83
    Points
    83
    Par défaut
    plus d'explications ? ou d'autre réponses précises seraient les bienvenus...

  4. #4
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    tech lead c++ linux
    Inscrit en
    Août 2004
    Messages
    4 262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : tech lead c++ linux

    Informations forums :
    Inscription : Août 2004
    Messages : 4 262
    Points : 6 680
    Points
    6 680
    Billets dans le blog
    2
    Par défaut
    Je crois que ce n'est pas très clair ta question. En tout cas, moi je ne comprend pas.
    « L'effort par lequel toute chose tend à persévérer dans son être n'est rien de plus que l'essence actuelle de cette chose. »
    Spinoza — Éthique III, Proposition VII

  5. #5
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par virtuadrack
    Il faut une méthode pour que le nombre de colonnes devienne le nombre de lignes et vice-verca.
    Si j'ai bien compris, ta transformation n'est pas bonne?
    Tu peux être plus clair? (ce que tu veux + ce que tu as + le problème).
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  6. #6
    Membre régulier
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Points : 83
    Points
    83
    Par défaut
    désolé si j'ai pas été clair

    je reformule mon problème,

    je possède un fichier de données qui constitue un tableau
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    P3 //pas important
    4 1  // 4 colonnes et 1 ligne
    255 // pas important
    /* le tableau */
    10 11 12  20 21 22  30 31 32  40 41 42
    un autre exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    P3
    3 2  // 3 colonnes et 2 lignes
    255 // pas important
    /* le tableau */
    10 11 12  20 21 22  30 31 32
    40 41 42  50 53 23  12 13 14
    Je voudrais lire le fichier, enregistrer le tableau de données dans un vecteur (déjà fait dans la fonction read_PPM dans mon 1er post) puis écrire un nouveau fichier dont les données seraient organisées de tel maniere a ce que le nombre de colonnes deviennent celui des rangees et le nombre des rangees deviennent celui des colonnes. (Ce qui est une rotation en fait d'une image .ppm)

    La rotation donc du premier fichier donnée donnerait cet output:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    P3
    1 4 // 1 colonne, 4 rangées
    255 //pas important
    // tableau
    10 11 12 
    20 21 22 
    30 31 32 
    40 41 42
    Voila j'espère que j'ai bien expliquer cette fois, je suis bloquer dans le sens ou je ne trouve pas d'algorithme approprie pour ce faire, j'aimerais bien des exemples qui m'aideront fortement, des conseils seraient les bienvenus.

    Merci

  7. #7
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Je verrais bien une map de vecteurs. Chaque entrée dans la map contiendrait en clé l'indice de la ligne et le vecteurs des colonnes en valeur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <vector>
    #include <map>
     
    stuct myStruct { 
       char val1; 
       char val2; 
       char val3 };
     
    std::map< int, std::vector<myStruct>> myMap;
    Ensuite tu construis un autre map faite à partir du parcours de la première:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    std::map<int, std::vector<myStruct>> mySecondMap;
     
    size_t nbColonnes = myMap.begin().size();
    size_t nbLignes = myMap.size();
     
    for(size_t indexLigne=0; indexLigne<nbLignes; indexLigne++)
    {
       for(size_t indexColonne=0; indexColonne<nbColonnes; indexColonne++)
          mySecondMap[indexColonne].push_back(myMap[indexLigne].at(indexColonne));
    }
    Inconvénient: parcours de toute la map + opérator = doit être défini pour la structure.

    PS: je n'ai pas testé ce code
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  8. #8
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Écrivons les coordonnées des points que tu manipules, par exemple dans le second cas (en oubliant qu'ils sont composés de 3 valeurs, R G et B ?) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    (0, 0)  (0, 1) (1, 2)
    (1, 0) (1, 1) (1, 2)
    Et tu veux, si j'ai bien compris :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    (1, 0) (0, 0)
    (1, 1) (0, 1)
    (1, 2) (0, 2)
    A toi de voir comment imbriquer deux boucles for pour que lors de l'exécution on passe dans l'ordre indiqué par le second tableau.

    Maintenant, comment stocker tes points ? Le plus simple est d'utiliser un vector<Pixel> (Pixel étant une structure ayant les valeurs R, G et B), de taille nbLignes * nbColonnes, et avec la convention que le point de coordonnée (i, j) sera placé dans la case numérotée (i*nbColonnes) + j

    Avec ça, tu as tout ce qu'il te faut pour résoudre toi même ton problème (qui ressemble à un exercice scolaire, si je ne me trompe).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  9. #9
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    (qui ressemble à un exercice scolaire, si je ne me trompe).
    Mince
    Ca me perdra..
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Au départ, tu lis les lignes et tu mets les infos dans un vecteur de string. Il faut que tu parses chacune de ces strings pour construire pour chaque ligne un vecteur de points3D. Enfin, tu écris non plus ligne par ligne, mais élément i de chaque ligne les un après les autres. Ca te donne quelque chose comme ça:
    -> Une classe pour ton vecteur 3D,
    -> Une liste de vecteur 3D,
    -> Une liste de liste de vecteur 3D.

    La lecture des vecteurs 3D dans chacune des lignes est à l'instar de ce que tu as fait lors de la lecture de ton fichier. Ensuite, il te faut gérer les erreurs (une ligne sans multiple de 3 éléments, des lignes plus petites ou plus grandes que les autres, etc...).
    Par liste, il faut entendre un ensemble de données ordonnée et pas un type particulier (tableau, liste, vecteur,...).
    Par contre, je ne vois pas trop l'intérêt d'une map?

  11. #11
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Par contre, je ne vois pas trop l'intérêt d'une map?
    Ca me semble plus pratique et utilisable qu'une liste de liste.
    Mais ça reste un choix arbitraire
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  12. #12
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Spout Voir le message
    Ca me semble plus pratique et utilisable qu'une liste de liste.
    Mais ça reste un choix arbitraire
    Mouais, ca masque la liste de liste par une liste d'association clé/liste. J'aurais peur d'obscurcir la chose. Mais bon, je peux comprendre et ça ne me choquerais pas surtout si c'est un choix arbitraire...

  13. #13
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    J'aurais peur d'obscurcir la chose.
    Je comprends pas ?
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  14. #14
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Pour moi, c'est plus claire de dire que j'ai une liste de listes de vecteurs que une map sur une liste de vecteurs. La question avec la map est que signifie la clé? Alors qu'elle n'a pas vraiment de sens. C'est ce que je voulais dire par obscurcir la chose (phrase qui était elle-même obscure ).

  15. #15
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    La question avec la map est que signifie la clé?
    C'est pas faux comme remarque .
    Ce qui me gêne en revanche avec la liste, c'est qu'on ne peut pas accéder directement aux éléments, on est obligés de parcourir. Peut être un vecteur de vecteur de stucture (ou tuple)?
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  16. #16
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Et vous lui reprochez quoi à mon vector mis à plat ?
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  17. #17
    Membre éprouvé
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Et vous lui reprochez quoi à mon vector mis à plat ?
    Pour moi ça ajoute une complication de gestion de ses données. Et donc des possibilités d'erreurs. Au moins avec un conteneur de conteneur, les indices correspondent bien aux index de ligne/colonne et permet de limiter les possibilités d'erreurs.
    Mais peut être que le conteneur de conteneur est plus gourmand en ressources? Temps?
    "L'ordinateur obéit à vos ordres, pas à vos intentions." [Anonyme]

  18. #18
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Une légère complexité dans l'accès (une multiplication), qu'effectivement j'encapsulerais dans une classe ad hoc (mais j'ai peur que le posteur initial n'ait pas encore vu ça) (d'ailleurs une telle classe serait bienvenue dans tous les cas).

    Par contre, la création de la structure est bien plus simple, alors qu'avec une structure à 2 niveaux, il faut créer N sous structures, s'assurer qu'elles ont la même taille... Au final, je trouve la structure unique plus simple.

    Et effectivement, sur le plan perfs, il y a des chances que ça joue, mais ce n'était pas là mon propos.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  19. #19
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Et vous lui reprochez quoi à mon vector mis à plat ?
    +1

    Pour faire de l'image il est même plutôt préférable d'uiliser cela. Côté complexité, je ne suis pas d'accord y as juste une toute petite opération de conversion des indice.
    C'est même une bien meilleur gestion de mémoire. Tu est sur que chaque ligne contient bien le même nombre de colonne.

    Sans compter d'autre avantage :
    - mémoire contigüe
    - accès à tous les pixel en une boucle
    - ...

  20. #20
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Vecteur mis à plat ou vecteur de vecteur, à mon avis, il y a moins d'ambiguïté qu'avec la map. Du coup, on est sur des type de données qu'on pourrait dire sémantiquement équivalente. Mais, il y a moins de risque à construire un vecteur de vecteur qu'avec le tableau où on peut toujours glisser sur les indices. Mais, globalement, les différentes solutions peuvent être satisfaisantes dans la mesure où il ne veut qu'aller d'un fichier à un autre.

Discussions similaires

  1. [fstream] Manipulation d'un fichier ...
    Par Zenol dans le forum SL & STL
    Réponses: 6
    Dernier message: 11/02/2006, 10h49
  2. manipulation d'un fichier indexé par un arbre b
    Par nemya_1 dans le forum Algorithmes et structures de données
    Réponses: 1
    Dernier message: 21/01/2006, 19h30
  3. lecture de mon fichier de donnees initiales
    Par salseropom dans le forum C
    Réponses: 9
    Dernier message: 13/01/2006, 14h41
  4. Réponses: 3
    Dernier message: 01/10/2005, 21h26
  5. Réponses: 4
    Dernier message: 31/07/2004, 11h14

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