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 :

Stockage des lignes d'un fichier


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Par défaut Stockage des lignes d'un fichier
    Hello,
    Je souhaite créer une fonction qui renvoie une structure contenant les lignes (sous forme d'un char **) contenues dans un fichier dont le chemin est passé en paramètre.

    Donc pour faire ca, je compte initialiser le tableau de chaines, et réallouer la mémoire au fur et a mesure pour stocker chaques ligne qu'on rencontre jusqu'a la fin du fichier, puisqu'on ne peut pas (a ma connaissance) savoir a l'avance le nombre de ligne que contiens un fichier.

    En fait je voulais simplement demander si cette stratégie est la bonne, et surtout la meilleur, en considérant que je souhaite économiser au maximum la mémoire, vu que ca me parait relativement lourd de réallouer la mémoire pour chaque ligne, et que d'un autre coté je me vois mal compter le nombre de ligne avant et ensuite lancer la récupération et le stockage des lignes...

    Merci d'avance

  2. #2
    Membre éclairé
    Avatar de odsen.s
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2006
    Messages
    269
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2006
    Messages : 269
    Par défaut
    Salut,
    et que d'un autre coté je me vois mal compter le nombre de ligne avant et ensuite lancer la récupération et le stockage des lignes...
    Et pourquoi pas ?
    Ca me paraît être la méthode la plus simple.
    Ca sera plus performant que des malloc() + realloc().
    (Une seule allocation, et compter le nombre de lignes, c'est assez rapide).

  3. #3
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Par défaut
    La méthode la plus simple probablement mais la plus performante?

  4. #4
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Par défaut
    @medinoc: quand tu parle de réallocation, ca concerne bien les lignes, donc le tableau de pointeurs (et non les tableau qui stockent les chaines elles mêmes)?

    La dessus, comme je souhaite ne pas perdre de mémoire, je compte réalouer la mémoire à chaque nouvelle ligne rencontrée. je souhaite éviter d'allouer par exemple 50 espaces mémoires alors que au bout de 10 lignes lues le fichier se termine, ce qui laisserait les 40 autres ds le vide...

    Bref je voudrait performance niveau temps de calculs et stockage minimal niveau mémoire... Je suppose que je vais devoir implémenter plusieurs algorithmes et tester chacun d'entre eux.

  5. #5
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 400
    Par défaut
    Une autre méthode serait de lire tout le fichier en mémoire pour faire ton tableau de pointeurs ensuite. Mais je ne conseillerais ça que si tu ouvres le fichier en lecture seule.

    Pour stocket les lignes, tu peux en effet faire un tableau dynamique de pointeurs (généralement, on le réalloue de manière géométrique, avec un multiplicateur inférieur ou égal au nombre d'or : 1.5 est un choix assez populaire), ou une liste chaînée...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par vinzzzz
    Je souhaite créer une fonction qui renvoie une structure contenant les lignes (sous forme d'un char **) contenues dans un fichier dont le chemin est passé en paramètre.

    Donc pour faire ca, je compte initialiser le tableau de chaines, et réallouer la mémoire au fur et a mesure pour stocker chaques ligne qu'on rencontre jusqu'a la fin du fichier, puisqu'on ne peut pas (a ma connaissance) savoir a l'avance le nombre de ligne que contiens un fichier.
    Rien n'empêche de lire le fichier avant pour compter le nombre de lignes du fichier et allouer la bonne taille. Ca n'a rien de choquant.

    Sinon, une liste chainée est bien adaptée à ce traitement. Si il faut ensuite naviguer en avant et en arrière (traitement de texte, par exemple), une liste doublement chainée est préférable.

  7. #7
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Par défaut
    Rien de choquant c'est sur, mais parcourrir deux fois le même fichier me paraissait un peu lourd niveau performance. Mais d'un autre coté, la réallocation de la mémoire a chaque ligne prendrait probablement beacoup de temps également, si ce n'est plus..

  8. #8
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    491
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 491
    Par défaut
    Au passage, il serait possible de récupérer de la mémoire allouée mais non utilisée?
    Exemple j'alloue un bloc pour 1024 caractères pour la lecture des lignes du fichier, or certaines n'en font que 10...

    Ca me fait tjr mal a coeur de laisser toute cette mémoire non utilisée...

    EDIT: non ma question a pas bcp d'interet, si je souhaite faire ca autant récupérer ma ligne et alouer en fonction de ce qui a été récupéré...

  9. #9
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par vinzzzz
    Au passage, il serait possible de récupérer de la mémoire allouée mais non utilisée?
    Exemple j'alloue un bloc pour 1024 caractères pour la lecture des lignes du fichier, or certaines n'en font que 10...

    Ca me fait tjr mal a coeur de laisser toute cette mémoire non utilisée...
    Si tu acceptes de faire une copie, tu peux utiliser strdup() (POSIX.1, donc très portable. D'autre part, cette fonction est facile à reproduire)

    (pseudo-code)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
       char ligne[1024];
       size_t i = 0;
       while (fgets (ligne, sizeof ligne, fp) != NULL)
       {
          /* nettoyage eventuel... */
          tab[i] = strdup (ligne);
          i++;
       }

  10. #10
    Rédacteur

    Avatar de gege2061
    Femme Profil pro
    Administrateur de base de données
    Inscrit en
    Juin 2004
    Messages
    5 840
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 42
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Juin 2004
    Messages : 5 840
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Si tu acceptes de faire une copie, tu peux utiliser strdup() (POSIX.1, mais très portable)
    Ce n'est pas la fonction la plus dur à recoder : http://c.developpez.com/sources/c/?p...#STRING_copier

  11. #11
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 400
    Par défaut
    Réallouer à chaque ligne est inutile.
    SI tu alloues pour cinquante lignes et que tu n'en as que 10, rien ne t'empêche de réallouer une fois que tu as tout lu...

    Une réallocation, ce n'est pas toujours pour augmenter la taille...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  12. #12
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par vinzzzz
    Rien de choquant c'est sur, mais parcourrir deux fois le même fichier me paraissait un peu lourd niveau performance. Mais d'un autre coté, la réallocation de la mémoire a chaque ligne prendrait probablement beacoup de temps également, si ce n'est plus..
    Tu peux profiter de cette lecture pour calculer la longueur max d'une ligne, ce qui peut aider pour la suite...

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

Discussions similaires

  1. macro=remove des lignes d un fichier xls et reorga
    Par af_airone dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 26/10/2005, 16h08
  2. Shell pour supprimer des lignes d'un fichier
    Par nelsa dans le forum Autres langages
    Réponses: 2
    Dernier message: 20/09/2004, 13h26
  3. Extraire des lignes d'un fichier en commande bash
    Par newnew dans le forum Linux
    Réponses: 3
    Dernier message: 27/07/2004, 17h22
  4. Réponses: 4
    Dernier message: 24/04/2003, 23h28

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