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 :

Lire un fichier ligne par ligne et récupérer les resultats


Sujet :

C

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Points : 65
    Points
    65
    Par défaut Lire un fichier ligne par ligne et récupérer les resultats
    bonjour,
    J'ai un fichier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    seq_id01,ch_idx,pos1,end1,GGTGCTTCAAACGTTTTTTTTTTTACGACTAGCATTTTTTTTTTTTTTTTTCGACTACGCTACGACTCGATCACGATCC
    seq_id01,ch_idy,pos2,end2,TTTTGGTGCTTCAAACGTTTTTTTTTTTACGACTAGCATTTTTTCGACTACGCTACGGTGCTTCAAACGTTTTTTTTTTTACGACTAGCATGATCC
    seq_id01,ch_idd,pos3,end3,GCTAGCTACGACTACGACTACGCATAAAAAAAAAAAAAGACTACGCTACGACTCGATCACGATCC
    seq_id02,ch_idv,pos1,end2,AAAAAAAAAAAAAAAACGATCACGACTACGATCGCATCAGCTAGCATTTTTTTTTTTTTTACGACTTTCGCGCTCAGCATCTGACTAC
    seq_id02,ch_idu,pos2,end2,ACGACTAGCATCAGCATCTTTTTTTACGACGGGGGGGGGGGGGGCGCGCGCGCGAAAAAAAAAAAAAAAAAAAAAAAAAA
    seq_id03,ch_idx,pos1,end1,TTTTTTCGATCGTATAAACGATCGACTCGCTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTCGACGATCACA
    seq_id03,ch_idx,pos2,end2,AAAACATCAGCATCAGCTCGCCCCCCCCCCCCCCAGCATCAGCTAGCATCAGCTACGACTACGATCAGCTACGACTAAA
    .......
    Je veux recuperer les lignes mais je veux décomposer les lignes suivant les virgule(,) et stocker chaque partie dans une variable.
    comment faire?

  2. #2
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2012
    Messages : 63
    Points : 68
    Points
    68
    Par défaut
    Salut,

    perso je ferais une liste chaînée, tu aura une case de liste par ligne, et dans cette case tu met un char **, comme sa tu pourra stoker chaque chaîne entre les virgules, et tu fait un next quand tu voie un '\0', tu malloc ton tab comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab = malloc(sizeof(char*)* 5)
    et après tu malloc ton tab[0][case_a_malloc] de la taille de se que tu a lus jusque a ta virgule.
    Je ne sais pas si je suis bien clair.

    Cordialement,

    Takago.

  3. #3
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Un format de scanf tel que "%s,%s,%d,%d,%s" pourrait te servir. (en supposant que les positions sont des nombres).

    En fouillant un peu plus, je suis sur que tu peux même indiquer les tailles max des champs.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  4. #4
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Points : 65
    Points
    65
    Par défaut
    Citation Envoyé par takago Voir le message
    Salut,

    perso je ferais une liste chaînée, tu aura une case de liste par ligne, et dans cette case tu met un char **, comme sa tu pourra stoker chaque chaîne entre les virgules, et tu fait un next quand tu voie un '\0', tu malloc ton tab comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tab = malloc(sizeof(char*)* 5)
    et après tu malloc ton tab[0][case_a_malloc] de la taille de se que tu a lus jusque a ta virgule.
    Je ne sais pas si je suis bien clair.

    Cordialement,

    Takago.
    Je veux éviter les listes chainée.
    Je veux bien utiliser les tableaux. c-à dire stocker les valeurs dans un tableau.
    est-ce qu'il y a une solution?
    merci

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2012
    Messages : 63
    Points : 68
    Points
    68
    Par défaut
    Salut,

    Si tu veux utiliser uniquement les tableaux tu vas devoir utiliser un char *** ... Se qu'y n'est pas forcement évident, pour moi passer par une liste chaînée est beaucoup plus simple, et tu pourra accédé a tes valeurs plus facilement.

    Takago.

  6. #6
    Membre chevronné

    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
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    Ton fichier a l'air d'être au bon vieux format csv...

    1. Une solution pourrait donc être d'utiliser une librairie pour parser ce format, je suis sûr qu'il en existe plein (mais, expert plus en c++ qu'en c, je te laisse chercher :-)
    2. White_tentacle a écrit un très bon article sur la question pour le C++ mais la logique est là pour le C également: http://www.developpez.net/forums/d15...pp-faire-faut/
    3. Si tu veux un tableau tu auras un type homogène: que des strings, pas un mix int/strings, sauf à faire d'abord une structure perso, comme struct Line { int pos; int len; char* s; } puis un tableau de structs
    4. Après c'est selon la performance exigée, la volonté de gérer les erreurs, etc. Il faut un peu plus de renseignements pour te mettre sur la piste

  7. #7
    Membre chevronné

    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
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    Au passage je confirme que la logique C serait plutôt de faire une liste chaînée car la gestion de la mémoire sera assez cauchemardesque si tu ne connais pas le nombre de lignes au départ.
    Ton désir de tableau s'accorderait mieux avec un vector du C++...

  8. #8
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Points : 65
    Points
    65
    Par défaut
    est-ce que je peux créer un enregistrement et stocker les valeurs de chaque ligne dans une variable? parexemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    enregistm{char *seqid,char *cid; int posid; int endid; char *ch; }
    qu'est ce que vous pensez de cette approche?
    en plus j'ai pas pu diviser chaque variable (séparé par un virgule) apart. comment faire ici?
    Merci

  9. #9
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    que ca serait possible, a condition de faire des malloc sur chaque pointeurs avant. Donc de connaitre la taille à allouer.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  10. #10
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2012
    Messages : 63
    Points : 68
    Points
    68
    Par défaut
    Avec cette méthode tu vas vite avoir des soucis ... Tu a 5 variables une par valeur que tu recup, jusque la si tu n'a qu'une ligne dans ton fichier tu aura pas de souci mais vue que tu en un nombre indéterminé, u ne peux pas faire une fonction avec les adresses de tes variables.
    Si tu lis ligne pas ligne, a chaque nouvelle ligne tu vas perdre les valeurs précédemment recéperais, pas top comme système.

    Je le redis la façon la plus simple pour moi reste les listes chaînées, je ne voie vraiment pas pourquoi tu ne veux pas les utiliser.

  11. #11
    Membre chevronné

    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
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par mido1951 Voir le message
    est-ce que je peux créer un enregistrement et stocker les valeurs de chaque ligne dans une variable? parexemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    enregistm{char *seqid,char *cid; int posid; int endid; char *ch; }
    qu'est ce que vous pensez de cette approche?
    en plus j'ai pas pu diviser chaque variable (séparé par un virgule) apart. comment faire ici?
    Merci
    1) pour l'approche enregistrements/lignes: soit tu connais le nombre de lignes (ou bien tu traverses tout le fichier pour compter les retours à la ligne) et dans ce cas-là l'approche est valable; soit non, et tu vas devoir faire beaucoup de réallocations et de copies
    2) pour remplir tes enregistrements, tu peux utiliser sscanf à partir d'une chaîne de caractères:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    const char* test = "abcd,efgh,12,14,abcdefghijkl";
     
      int posid, endid;
      char *seqid = (char*) malloc(5*sizeof(char)), *sid = (char*) malloc(5*sizeof(char)), *ch = (char*) malloc(15*sizeof(char));
     
      sscanf(test, "%[^,],%[^,],%d,%d,%[^\n]", seqid, sid, &posid, &endid, ch);

  12. #12
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Et prends garde, quand tu fais les mallocs, de compter une case pour le \0.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  13. #13
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Points : 65
    Points
    65
    Par défaut
    Citation Envoyé par stendhal666 Voir le message
    1) pour l'approche enregistrements/lignes: soit tu connais le nombre de lignes (ou bien tu traverses tout le fichier pour compter les retours à la ligne) et dans ce cas-là l'approche est valable; soit non, et tu vas devoir faire beaucoup de réallocations et de copies
    2) pour remplir tes enregistrements, tu peux utiliser sscanf à partir d'une chaîne de caractères:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    const char* test = "abcd,efgh,12,14,abcdefghijkl";
     
      int posid, endid;
      char *seqid = (char*) malloc(5*sizeof(char)), *sid = (char*) malloc(5*sizeof(char)), *ch = (char*) malloc(15*sizeof(char));
     
      sscanf(test, "%[^,],%[^,],%d,%d,%[^\n]", seqid, sid, &posid, &endid, ch);
    merci cette solution marche pour mes premier test (sans faire l'enregistrement) mais ça veut dire quoi les ?
    Merci

  14. #14
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2012
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2012
    Messages : 63
    Points : 68
    Points
    68
    Par défaut
    Man sscanf.

  15. #15
    Membre chevronné

    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
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    %[^,] ça veut dire: mange tout ce qui n'est pas une virgule.

  16. #16
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Points : 65
    Points
    65
    Par défaut utilisation des enregistrements pour les traitements _approches_
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    seq_id01,ch_idx,pos1,end1,GGTGCTTCAAACGTTTTTTTTTTTACGACTAGCATTTTTTTTTTTTTTTTTCGACTACGCTACGACTCGATCACGATCC
    seq_id01,ch_idy,pos2,end2,TTTTGGTGCTTCAAACGTTTTTTTTTTTACGACTAGCATTTTTTCGACTACGCTACGGTGCTTCAAACGTTTTTTTTTTTACGACTAGCATGATCC
    seq_id01,ch_idd,pos3,end3,GCTAGCTACGACTACGACTACGCATAAAAAAAAAAAAAGACTACGCTACGACTCGATCACGATCC
    seq_id02,ch_idv,pos1,end2,AAAAAAAAAAAAAAAACGATCACGACTACGATCGCATCAGCTAGCATTTTTTTTTTTTTTACGACTTTCGCGCTCAGCATCTGACTAC
    seq_id02,ch_idu,pos2,end2,ACGACTAGCATCAGCATCTTTTTTTACGACGGGGGGGGGGGGGGCGCGCGCGCGAAAAAAAAAAAAAAAAAAAAAAAAAA
    seq_id03,ch_idx,pos1,end1,TTTTTTCGATCGTATAAACGATCGACTCGCTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTCGACGATCACA
    seq_id03,ch_idx,pos2,end2,AAAACATCAGCATCAGCTCGCCCCCCCCCCCCCCAGCATCAGCTAGCATCAGCTACGACTACGATCAGCTACGACTAAA
    .......
    en continuité avec ce problème, j'ai stocké les différentes valeurs en utilisant un enregistrement.
    Mais mois je ne vais pas remplir les enregistrements avec toutes les lignes du fichier, je veux juste stocké dans un tableau d'enregistrement les lignes qui ont les mêmes seq_id.
    par exemple, je veux prendre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    seq_id01,ch_idx,pos1,end1,GGTGCTTCAAACGTTTTTTTTTTTACGACTAGCATTTTTTTTTTTTTTTTTCGACTACGCTACGACTCGATCACGATCC
    seq_id01,ch_idy,pos2,end2,TTTTGGTGCTTCAAACGTTTTTTTTTTTACGACTAGCATTTTTTCGACTACGCTACGGTGCTTCAAACGTTTTTTTTTTTACGACTAGCATGATCC
    seq_id01,ch_idd,pos3,end3,GCTAGCTACGACTACGACTACGCATAAAAAAAAAAAAAGACTACGCTACGACTCGATCACGATCC
    et stocké ces trois lignes dans un tableau d'enregistrement pour faire un certain traitement.
    puis stocké les seq_id02 dans un tableau d'enregistrement (le même tableau en écrasant l'ancien) par exemple on obtient:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    seq_id02,ch_idv,pos1,end2,AAAAAAAAAAAAAAAACGATCACGACTACGATCGCATCAGCTAGCATTTTTTTTTTTTTTACGACTTTCGCGCTCAGCATCTGACTAC
    seq_id02,ch_idu,pos2,end2,ACGACTAGCATCAGCATCTTTTTTTACGACGGGGGGGGGGGGGGCGCGCGCGCGAAAAAAAAAAAAAAAAAAAAAAAAAA
    et ainsi de suite...
    est-ce que vous avez une idée?
    Merci

  17. #17
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2015
    Messages
    33
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2015
    Messages : 33
    Points : 32
    Points
    32
    Par défaut
    Bonjour,

    Pas vraiment d'idées désolé..
    Par contre j'en profite de passer par là pour vous conseillez de bien vérifier le retour de malloc.

    Celui-ci renvoi NULL en cas d’échec, ce qui provoque une erreur de segmentation lors du déréférencement.. (NULL n'étant pas une adresse valide ^^).

    De plus (mais là c'est à prendre avec des pincettes, je ne suis pas sûr de moi, et l'avis de quelqu'un de plus expérimenté serait appréciable), il faut penser en cas d'erreur d'un malloc de free tous les malloc précédents ayant réussis.

    Bon courage!

  18. #18
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    De plus (mais là c'est à prendre avec des pincettes, je ne suis pas sûr de moi, et l'avis de quelqu'un de plus expérimenté serait appréciable), il faut penser en cas d'erreur d'un malloc de free tous les malloc précédents ayant réussis.
    Et tu as raison.

  19. #19
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    317
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meuse (Lorraine)

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

    Informations forums :
    Inscription : Mars 2011
    Messages : 317
    Points : 65
    Points
    65
    Par défaut
    est-ce qu'il y a d'autres suggestions? ou d'autres approches?
    Merci

  20. #20
    Membre chevronné

    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
    Points : 1 878
    Points
    1 878
    Billets dans le blog
    21
    Par défaut
    Tu as deux approches: statique et dynamique.

    Dans l'approche statique tu évites d'utiliser trop de pointeurs (cela devrait te faire plaisir si je ne me trompe pas!):

    - voilà ton enregistrement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    struct Enregistrement{
      char seqId[20];
      char chId[20];
      int posid, endid;
      char ch[100];
    } ;
    - voilà ton tableau:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    struct Enregistrement tableau[TAB_SIZE];
    et voilà la logique générale:
    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
    25
    26
    27
    28
    29
     
      char *line, *precedent;
      size_t lus;
      int i, read;
     
      line = precedent = NULL;
      i = 0;
      while ( true ) {
     
          read = getline(&line, &lus, input); // on lit une ligne du fichier
          struct Enregistrement enr;
     
          if (read != -1) { // si on a bien lu une ligne (sinon getline renvoie -1)
            peuplerEnregistrement(line, &enr); // avec sscanf
          }
     
          if (read == -1 || // si on en a fini avec le fichier ou que... 
              precedent && strcmp(enr.seqId, precedent) != 0) { // il y a une ligne précédente et qu'elle est différente de la nouvelle ligne
              utliserLignesLues(tableau, i) // traiter les lignes du tableau de 0 à i
              i = 0; // et réinitialiser i
          }
     
          precedent = enr.seqId;
          tableau[i] = enr;
          free(line); line = NULL;
          lus = 0;
          ++i;
          if (read == -1) break; // si on est arrivés à la fin du fichier on quitte
      }
    Avec l'approche statique, le problème est que tu dois être sûr de la longueur des différents éléments: caractères dans les strings, nombre de lignes dans le tableau.
    Avec une approche dynamique tu alloues la mémoire, et si tu dépasses ton allocation initiale tu réalloues de la mémoire supplémentaire et surtout tu n'oublies pas de la libérer...

Discussions similaires

  1. Réponses: 9
    Dernier message: 03/07/2014, 18h08
  2. lire une base de donnee ligne par ligne
    Par thildouille dans le forum Langage
    Réponses: 9
    Dernier message: 03/06/2011, 00h50
  3. lire fichier .txt (NOTEPAD) ligne par ligne
    Par skambram dans le forum VB.NET
    Réponses: 1
    Dernier message: 06/06/2009, 18h41
  4. lire un fichier de string ligne par ligne
    Par bilzzbenzbilz dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 11/02/2009, 10h44
  5. Réponses: 3
    Dernier message: 16/10/2007, 20h45

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