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 :

Lecture et Stockage du contenu d'un fichier


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 138
    Par défaut Lecture et Stockage du contenu d'un fichier
    Bonjour a vous,
    Ca fait un moment que j'ai pas fait de C++ et j'ai du mal a me retrouver sur des choses "simples".
    En fait je vous explique la fonctionnalité:
    Je dois lire un fichier texte et ensuite travailler sur ce contenu.

    La méthode que j'ai pour l'instant choisi est de lire le fichier ligne a ligne.
    Cependant, pour stocker ces lignes, je ne sais pas si il vaut mieux utiliser des vecteurs ou alors un tableau de String.

    D'ailleurs pour etre honnête, je ne comprends pas grand chose à la doc des vecteurs et je n'arrive pas a les utiliser correctement. Le tableau de string pourrait faire l'affaire mais ca me semble moins propre vu que le fichier peut contenir pas mal de lignes.

    Donc je vous demande deux choses.
    Tout d'abord, tableau de string ou alors vecteur?
    Et dans ces cas, comment implémenter le stockage pour que je puisse parcourir leur contenu?
    En terme plus technique, si par exemple j'utilise des vecteurs, quel est le code pour parcourir mon vecteur élément par élément (chaque élément étant une ligne de mon fichier) et pour chaque ligne, parcourir les différents caractères pour que je puisse en extraire les informations dont j'ai besoin ?

    Grossièrement , j'aimerais un truc de ce genre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Tant que mon fichier n'est pas fini{
     Je lis la ligne et la stocke dans une liste (tableau ou vecteur).
    }
    ...
    //Ensuite dans un deuxième temps:
    Tant que ma liste n'est pas finie{
       Tant que je ne suis pas à la fin de mon élément{
         Si cet_element contient le caractère "=" alors je récupère ce qui suite le égal et je continue le parcours de ma ligne.
       }
    }
    Merci d'avance !

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    1 138
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 1 138
    Par défaut
    Ok pour les vecteurs, j'ai trouvé votre doc:
    http://c.developpez.com/faq/cpp/?page=STL#STL_vector

    Beaucoup plus compréhensible que celle de builder. Je pense que je vais m'en sortir avec ça. Ceci dit, ma question sur le choix entre un tableau de strings et les vecteurs tient toujours. C'est à dire, si on considère que je dois stocker plusieurs milliers d'éléments, quelle solution choisir?
    D'instinct, je dirai les vecteurs pour la gestion de la mémoire mais bon l'instinct joue parfois de mauvais tours ^^

  3. #3
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Oui se serait plus un vector qu'un tableau de string pour la raison que tu évoques(tu ne te soucies pas de l'allocation mémoire(allouer/réallouer les dimensions de ton tableau)

    D'autres questions ?

  4. #4
    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 AMHA une structure dynamique est la plus appropriée
    Selon moi, une structure dynamique (donc, typiquement, les vector de la STL, mais tu peux envisager les queue ou autres, selon la nécessité) sera beaucoup plus appropriée qu'un tableau "à la C"... Surtout si tu as un fichier de plusieurs millier de lignes, et à plus forte raison si tu ignore le nombre de lignes qu'il contient.

    En effet, si tu décide d'utiliser un tableau simple, tu te trouve face à deux solutions qui ne sont, pour être tout à fait honnete, pas vraiment à mon gout:

    Soit, tu décide de déclarer un tableau d'une taille suffisante par rapport à l'ensemble des lignes que tu t'apprete à lire (mais, dans ce cas là, quelle taille va-tu lui donner? 1000??? 10.000??? 150.000???.. et si la taille ne suffit pas???, et si, au contraire, elle est 100 fois trop importante???)

    Soit tu gere la taille de ton tableau de manière dynamique: en réallouant un espace plus grand chaque fois qu'il atteind sa limite...

    Mais, dans ce cas là, chaque réallocation va prendre de plus en plus de temps (ne serait-ce qu'à cause de la recopie systématique des lignes déjà lues), et il deviendra de plus en plus difficile de trouver une plage d'adresses mémoire contigues suffisemment grande pour contenir le tableau à sa nouvelle taille, tout en n'ayant pas encore libéré l'espace de l'ancien (vu qu'il faudra recopier les lignes)

    Et le problème se posera que tu d'augmenter la taille de ton tableau par 1, 5 ou 100 éléments...

    Sauf erreur de ma part, tous les conteneurs de la STL sont créés sur base d'une file ou d'une pile, ce qui palie grandement à ces deux désagréments (vu que, l'allocation ne se fait, hormis si tu le demande expressément autrement, que de la taille d'un élément à la fois)

    Et comme la STL est franchement robuste et stable, il me semble presque plus intéressant (hormis dan un cadre purement didactique) de l'utiliser dans un tel cas.

    Maintenant, je n'ai fait que donner mon avis personnel sur le sujet, mais je le partage
    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

  5. #5
    Membre chevronné Avatar de aziz jim
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2005
    Messages
    455
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2005
    Messages : 455
    Par défaut
    j'avais le même problème à resoudre. je l'ai fait en utilisant getline() pour la lecture de la ligne.et un faux tableau pour le stockage des caractères.

  6. #6
    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 : 50
    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
    Par défaut
    Citation Envoyé par koala01
    Et le problème se posera que tu d'augmenter la taille de ton tableau par 1, 5 ou 100 éléments...

    Sauf erreur de ma part, tous les conteneurs de la STL sont créés sur base d'une file ou d'une pile, ce qui palie grandement à ces deux désagréments (vu que, l'allocation ne se fait, hormis si tu le demande expressément autrement, que de la taille d'un élément à la fois)
    Faux. Les std::vector sont justement des tableaux dynamiques, mais dont la taille augmente non pas d'une nombre de ligne constant, mais d'un facteur multiplicatif constant(*). C'est ce détail qui permet d'avoir une allocation en temps constant amorti quand on fait push_back.

    A part ça, je seconde évidemment le conseil d'utiliser ces structures, ne serait-ce que par ce que du coup, on se moque de comment elles ont été implémentées...

    (*) : Question subsidiaire à ceux qui pensent pouvoir faire mieux que la STL : Quelle valeur prendriez vous pour cette constante ?
    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.

  7. #7
    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
    Citation Envoyé par JolyLoic
    Faux. Les std::vector sont justement des tableaux dynamiques, mais dont la taille augmente non pas d'une nombre de ligne constant, mais d'un facteur multiplicatif constant(*). C'est ce détail qui permet d'avoir une allocation en temps constant amorti quand on fait push_back.
    Ah, autant pour moi...

    Il est vrai que je ne me suis jamais réellement penché sur les détails meme de l'implémentation de la STL (j'ai déjà appris à m'en servir de manière autodidacte, c'est déjà pas si mal )

    Tant qu'à faire, du point de vue de l'implémentaion en elle-meme, comment cela fonctionne-t-il alors lorsque l'on décide de rajouter un élément alors que la capacité est atteinte?

    (exemple, une capacité de 10, on insère un 11eme élément, ce qui provoque l'augmentation de la capacité)

    Est-ce que le vector va "jouer au jeu" du "j'alloue pour 20 élements, puis je copie les dix premiers dans le nouveau avant de libérer l'ancien" ou va-t-il allouer 10 nouveaux éléments ailleurs, et utiliser un "pointeur" pour faire la relation entre les deux groupes de 10 éléments? (et ce, quel que soit le nombre d'éléments rajoutés)

    A vrai dire, cette question n'est là que pour améliorer un peu ma culture générale, et, comme il semble encore bien qu'il y aie différentes implémentations de la STL, on peut meme aller jusqu'à estimer qu'elles peuvent agire de manière différentes...

    Mais si quelqu'un devait avoir l'info sous la manche...
    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

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Tant qu'à faire, du point de vue de l'implémentaion en elle-meme, comment cela fonctionne-t-il alors lorsque l'on décide de rajouter un élément alors que la capacité est atteinte?
    Le tableau sera réalloué ailleurs, d'une taille multipliée par N (généralement 2), puis les éléments seront recopiés. std::vector est l'équivalent du tableau dynamique style C, ses éléments seront toujours contigüs en mémoire (c'est le seul conteneur qui assure cette condition).

    Si la contiguité pose problème (beaucoup de mémoire à allouer), tu as std::list qui est implémentée come une liste doublement chaînée, et std::deque qui est entre les deux : une liste de tableaux.

Discussions similaires

  1. Lecture d'un tableau contenu dans un fichier
    Par olivier21c dans le forum C++
    Réponses: 4
    Dernier message: 21/02/2012, 23h15
  2. lecture de valeurs numériques contenues dans un fichier xml
    Par yasse87 dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 21/04/2009, 19h13
  3. [AJAX] Lecture et affichage du contenu d'un fichier xml dans un menu deroulant
    Par undercrash dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 15/01/2008, 16h26
  4. Réponses: 4
    Dernier message: 26/06/2006, 11h41
  5. [VB5] |Lecture du contenu d'un fichier .TXRT|
    Par jlb59 dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 04/06/2006, 17h16

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