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. #21
    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
    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...
    Merci pour ton aide.
    Mais la partie " la logique générale" je ne l'ai pas bien compris.
    est-ce que tu peux m'expliquer un peu s'il vous plait?
    merci

  2. #22
    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
    Si j'ai bien compris ta demande, tu veux remplir ton tableau avec ton fichier; mais à chaque fois que seqId change, tu veux 1) faire ce qu'il y a à faire sur les lignes déjà enregistrées et 2) vider le tableau.

    Imagine que que tu as imprimé ton fichier, que tu l'as recouvert avec une autre feuille et que tu le découvres ligne par ligne:
    - à la première ligne, tu n'as pas de ligne précédente à comparer, donc tu continues (c'est pourquoi le pointeur precedent est initialisé à NULL)
    - ensuite à chaque nouvelle ligne, on la compare avec la précédente; si elle est identique, on continue, sinon on lance le traitement sur les n premières lignes et on enregistre la nouvelle à l'indice 0 du tableau.
    - enfin quand le fichier est entièrement découvert, il faut faire le dernier traitement sur le tableau

    Voilà la logique générale

  3. #23
    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
    j'ai fait la même chose avec la même logique générale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while (fgets(chaine,TAILLE_MAX, fichier) != NULL)
                {
    sscanf(chaine, "%[^,],%[^,],%d,%d,%[^,],%[^\n]", ligne[i].qid,ligne[i].sid,&ligne[i].posin,&ligne[i].posend,ligne[i].qseq,ligne[i].sseq);
      if (precedent != NULL && strcmp(ligne[i].qid,precedent)!= 0){
       i=0;
    }
    precedent = ligne[i].qid;
    i++;
                }
    ici il stocke mais qunad il entre dans if il réinitialise i=0 mais on ne peut pas mettre la nouvelle ligne[i].qid à sa place à ligne[0].qid .
    est-ce que vous avez une solution?
    merci

  4. #24
    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 mido1951 Voir le message
    j'ai fait la même chose avec la même logique générale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    while (fgets(chaine,TAILLE_MAX, fichier) != NULL)
                {
    sscanf(chaine, "%[^,],%[^,],%d,%d,%[^,],%[^\n]", ligne[i].qid,ligne[i].sid,&ligne[i].posin,&ligne[i].posend,ligne[i].qseq,ligne[i].sseq);
      if (precedent != NULL && strcmp(ligne[i].qid,precedent)!= 0){
       i=0;
    }
    precedent = ligne[i].qid;
    i++;
                }
    ici il stocke mais qunad il entre dans if il réinitialise i=0 mais on ne peut pas mettre la nouvelle ligne[i].qid à sa place à ligne[0].qid .
    est-ce que vous avez une solution?
    merci
    des réponses?

  5. #25
    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
    Oui, il y a une solution dans le code que je t'avais proposé: stocke la ligne que tu viens de lire non pas directement dans le tableau mais dans une variable temporaire, que tu choisis ensuite de copier dans le tableau à l'indice 0 ou à l'indice i.

  6. #26
    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
    Oui, il y a une solution dans le code que je t'avais proposé: stocke la ligne que tu viens de lire non pas directement dans le tableau mais dans une variable temporaire, que tu choisis ensuite de copier dans le tableau à l'indice 0 ou à l'indice i.
    c'est ce que j'ai fait.
    j'ai utiliser une variable "precedent" pour stocker et vérifier les valeurs.
    mais ça marche pas.

  7. #27
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     while (fgets(chaine,TAILLE_MAX, fichier) != NULL)
                {
    sscanf(chaine, "%[^,],%[^,],%d,%d,%[^,],%[^\n]", ligne[i].qid,ligne[i].sid,&ligne[i].posin,&ligne[i].posend,ligne[i].qseq,ligne[i].sseq);
     
    if (precedent != NULL && strcmp(ligne[i].qid,precedent)!= 0){
    for(j=0;j<i+1;j++){printf("\n Ligne[%d]: %s",j,ligne[j].qid);} //le traitement est l'affichage des valeurs stockées
     interm = ligne[i].qid;
       i=0;
    }
    if (interm != NULL) {ligne[i].qid=interm; interm=NULL;}
      precedent = ligne[i].qid;
    i++;
                }
    J'ai ajouté une valeur intermédiaire. ici ça marche mais après la dernière ligne du fichier il va trouver fgets(chaine,TAILLE_MAX, fichier) == NULL donc il ne va pas entrer dans while et je veux qu'il entre pour récupérer la dernière partie du tableau. ce ligne de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for(j=0;j<i+1;j++){printf("\n Ligne[%d]: %s",j,ligne[j].qid);} //le traitement est l'affichage des valeurs stockées
    comment faire pour qu'il entre pour la dernière fois.
    Je peux pas ajouter une ligne vide dans le fichier pour qu'il entre à cette partie du code.
    vous avez une solution?
    Merci

  8. #28
    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
    C'est pour ça que dans le code que je t'avais proposé je ne mettais pas de condition à la boucle : while (true)
    et que je testais si le retour de fgets / getline était NULL / -1 à l'intérieur de la boucle: si oui, alors faire le travail, puis break pour sortir du while

  9. #29
    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
    C'est pour ça que dans le code que je t'avais proposé je ne mettais pas de condition à la boucle : while (true)
    et que je testais si le retour de fgets / getline était NULL / -1 à l'intérieur de la boucle: si oui, alors faire le travail, puis break pour sortir du while
    ton code m'a beaucoup aidé mais si je l'utilise comme il est, ça marche pas parce que j'ai fait comme dans ton code.
    c'est pour ça que j'ai utilisé le while(fgets).

  10. #30
    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
    j'ai modifié le code:
    le voici:
    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
     while (fgets(chaine,TAILLE_MAX, fichier) != NULL)
                {
    sscanf(chaine, "%[^,],%[^,],%d,%d,%[^,],%[^\n]", ligne[i].qid,ligne[i].sid,&ligne[i].posin,&ligne[i].posend,ligne[i].qseq,ligne[i].sseq);
     
      printf("i= %d \n",i);
     printf("%s\n",ligne[i].qid);
    printf("precedent: %s\n",precedent); //quand j'affiche la meme valeur je la trouve qu'elle a changer alors qu'elle ne doit pas changer
    if (precedent != NULL && strcmp(ligne[i].qid,precedent)!= 0){
    for(j=0;j<=i;j++){printf("\n Ligne[%d]: %s",j,ligne[j].qid);}
     interm = ligne[i].qid;
       i=0;
    }
    if (interm != NULL) {ligne[i].qid=interm;interm=NULL;}
      precedent = ligne[i].qid;
     printf("precedent: %s\n",precedent); //il y a un cas ou j'ai precedent =seq08
    i++;
       }
     
     for(j=0;j<i+1;j++){printf("\n Ligne[%d]: %s",j,ligne[j].qid);}
    ici ça marche mais lorsqu'il y a une seule ligne, c'est à dire comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    seq07,....
    seq08,....
    seq09,....
    seq10,.....
    ici ça marche pas.
    il ne veut pas stocker chaque ligne dans un tableau en solo(j'ai trouvé le problème dans "precedent").
    est-ce que vous avez une solution?

  11. #31
    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
    Ton code est atrocement indenté ! J'espère que cela vient du copier-coller et qu'il n'est pas réellement comme ça dans ton IDE... Il est tellement mal indenté que je suis incapble de le lire (et je pense que si peu de gens te répondent, c'est aussi à cause de ça). Tu devrais déjà commencer par le mettre en forme proprement pour que sa logique apparaisse plus clairement.

    Deuxièmement, "ça ne marche pas" n'est pas un constat acceptable. Cela traduit soit une non analyse du résultat produit par ton code soit une non volonté de nous exposer clairement ton problème. Il faut que tu expliques clairement ce que tu obtiens et en quoi cela est différent de ce que tu attends. Cela nous aidera pour te guider mais surtout toi, cela t'aidera à trouver une solution !

    Enfin, je pense que tu galères depuis suffisamment de messages à essayer de bricoler sans succès : il est temps de lâcher le C et ton clavier et de prendre un papier et un stylo et d'écrire ton algorithme en français. Quand l'algorithme sera clair, alors tu pourras le traduire en C.

  12. #32
    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 Bktero Voir le message
    Ton code est atrocement indenté ! J'espère que cela vient du copier-coller et qu'il n'est pas réellement comme ça dans ton IDE... Il est tellement mal indenté que je suis incapble de le lire (et je pense que si peu de gens te répondent, c'est aussi à cause de ça). Tu devrais déjà commencer par le mettre en forme proprement pour que sa logique apparaisse plus clairement.

    Deuxièmement, "ça ne marche pas" n'est pas un constat acceptable. Cela traduit soit une non analyse du résultat produit par ton code soit une non volonté de nous exposer clairement ton problème. Il faut que tu expliques clairement ce que tu obtiens et en quoi cela est différent de ce que tu attends. Cela nous aidera pour te guider mais surtout toi, cela t'aidera à trouver une solution !

    Enfin, je pense que tu galères depuis suffisamment de messages à essayer de bricoler sans succès : il est temps de lâcher le C et ton clavier et de prendre un papier et un stylo et d'écrire ton algorithme en français. Quand l'algorithme sera clair, alors tu pourras le traduire en C.
    merci pour ta réponse.
    Mais mon programme est clair et d'après les messages précédents on voit bien le problème.
    tu vois beaucoup de printf() et beaucoup de choses se sont jutes des tests pour verifier c'est pour moi.
    Si je les enlève peut etre tu vois bien le programme.
    en plus, la logique est exacte mais il y a un problème j'ai pas pu le trouver c'est pour ça que j'ai besoin de votre aide.
    c'est tout.
    Merci en tout cas

  13. #33
    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
    La logique est exacte mais ton code ne marche pas. Moi, ça me parait assez antinomique...

    Pourrais-tu nous donner un code complet, qu'on pourrait compiler et exécuter ?

  14. #34
    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 Bktero Voir le message
    La logique est exacte mais ton code ne marche pas. Moi, ça me parait assez antinomique...

    Pourrais-tu nous donner un code complet, qu'on pourrait compiler et exécuter ?
    d'accord voici un code complet. mais il y a bcp de lignes de code c'est juste pour l'initialisation et déclaration des variables.
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    #include <unistd.h>
    #include <windows.h>
    struct ligne{
        char *qid;
        char *sid;
        int posin;
        int posend;
         char *qseq;
        char *sseq;
                };
     
    int main()
    {
        int TAILLE_MAX = 100000;
        int Tailleligne = 600;
       struct ligne ligne[Tailleligne];
    FILE* fichier = NULL;
    int i=0;
     
    for(i=0;i<Tailleligne;i++){
    ligne[i].posin=0; ligne[i].posend=0;
    ligne[i].qid = malloc(50*sizeof(char*));
    ligne[i].sid = malloc(50*sizeof(char*));
    ligne[i].qseq = malloc(100000*sizeof(char*));
    ligne[i].sseq = malloc(100000*sizeof(char*));
    }
     
     char *chaine=NULL; // Chaîne vide de taille TAILLE_MAX
    chaine = malloc(sizeof(char*)* 200000);
    char *precedent; char *interm;
        interm = NULL;
        precedent = NULL;
     
          fichier = fopen("G:/test", "r");
    int j=0;i=0;
     if (fichier == NULL)
     {
         // On affiche un message d'erreur si on veut
            printf("File not found");//      perror(msg);
     }
       while (fgets(chaine,TAILLE_MAX,fichier) != NULL)
                {
     sscanf(chaine,"%[^,],%[^,],%d,%d,%[^,],%[^\n]",ligne[i].qid,ligne[i].sid,&ligne[i].posin,&ligne[i].posend,ligne[i].qseq,ligne[i].sseq);
      printf("****------------------------------------------------\n");
           printf("i= %d \n",i);
     printf("%s\n",ligne[i].qid);
    printf("precedent:%s\n",precedent);
     printf("****-------------------------------------------------\n");
     
    if (precedent != NULL && strcmp(ligne[i].qid,precedent)!= 0){
    for(j=0;j<i;j++){printf("\n Ligne[%d]: %s",j,ligne[j].qid);}
     interm = ligne[i].qid;
    i=0;
    }
    if (interm != NULL) {ligne[i].qid=interm; printf("\ninterm: %s\n",interm);interm=NULL;}
      printf("i= %d \n",i);
      printf("%s\n",ligne[i].qid);
       precedent = ligne[i].qid;
     printf("precedent: %s\n\n\n",precedent);
    i++;
       }
     for(j=0;j<i;j++){printf("\n Ligne[%d]: %s",j,ligne[j].qid);}
    fclose(fichier);
        return 0;
    }
    j'utilise bcp de printf() parceque je veux détecter le problème et j'utilise une grande allocation de mémoire comme tu vois pour des fichiers encore très très grand.
    et voici un fichier juste pour exemple tu peux aussi le copier et le coller dans ton dossier et créer test.txt:
    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
    seq1,contig1,76,98,lsdhhfosdihfdsoihfdsoihf,sldhfdsohfdsoihfsdofhsdoif
    seq1,contig22,55,102,sjdhfosdhfsodhfsdokhfdssdfhdsojfhsdojf,ksjdhfskdjhfsdkljhfkjdslhfdslhfdslf
    seq1,contig123,12,1000,ooooooooooookjsdfdslhfldskfhds,kjshdfkdsjhfkdsjhfsdkjhfsdoh
    seq1,contig34,90,400,lfsdkhfldshflsdhfdslhfkdsf,sldkfhdslkhfdslkihfdslhflds
    seq2,contig14,736,918,dfsdfdsfdsfdsfdfds,sdfdsfdsfdsfsldhfdsohfdsoihfsdofhsdoif
    seq2,contig22,55,102,sdfsdfdsfdsfdsfdsf,ksjdhfskdjhfsdkljhfkjdslrwerewrewrewrewrhfdslhfdslf
    seq3,contig123,12,1000,ooooooooooookjsdfdsfdsfdsfdsfdsffdslhfldskfhds,kjshdfdsfsdfdsfwerwrewkdsjhfkdsjhfsdkjhfsdoh
    seq3,contig34,90,400,lfsdkhfldshflsdhfdslfgdfgdfgdfgfdgfdgfdgfdhfkdsf,sldkfhdslkhewrewrewrewdsfdsffdslkihfdslhflds
    seq3,contig1,76,98,lsdhhfosdihfdsoihfdsoihf,sldhfdsohfdsoihfsdofhsdoif
    seq4,contig22,55,102,sjdhfosdhfsodhfsdokhfdssdfhdsojfhsdojf,ksjdhfskdjhfsdkljhfkjdslhfdslhfdslf
    seq5,contig123,12,1000,ooooooooooookjsdfdslhfldskfhds,kjshdfkdsjhfkdsjhfsdkjhfsdoh
    seq5,contig34,90,400,lfsdkhfldshflsdhfdslhfkdsf,sldkfhdslkhfdslkihfdslhflds
    seq6,contig34,90,400,lfsdkhfldshflsdhfdslhfkdsf,sldkfhdslkhfdslkihfdslhflds
    seq6,contig34,90,400,lfsdkhfldshflsdhfdslhfkdsf,sldkfhdslkhfdslkihfdslhflds
    seq6,contig34,90,400,lfsdkhfldshflsdhfdslhfkdsf,sldkfhdslkhfdslkihfdslhflds
    seq7,contig34,90,400,lfsdkhfldshflsdhfdslhfkdsf,sldkfhdslkhfdslkihfdslhflds
    seq7,contig34,90,400,lfsdkhfldshflsdhfdslhfkdsf,sldkfhdslkhfdslkihfdslhflds
    seq8,contig34,90,400,lfsdkhfldshflsdhfdslhfkdsf,sldkfhdslkhfdslkihfdslhflds
    seq9,contig33,90,4400,lfsdkhgggfldshflsdhfdslhfkdsffldshflsdhfdslhfkdsf,sldkfhdslkhfdhfdsl
    seq10,contig38,500,400,lfsdkhfldshflsdhfdslhfkdsggggggf,sldkfhdslkhfdslk
    seq11,contig34,90,400,lfsdkhfldshflfkdsf,slkfhdslkhfdslk
    seq12,contig34,90,400,lfsdkhfldshflsdhfdslhfkdsf,sldkfhdslkhfdslkihfdslhflds
    seq13,contig34,90,400,lfsdkhfldshflsdhfdslhfkdsf,sldkfhdslkhfdslkihfdslhflds
    seq13,contig34,90,400,lfsdkhfldshflsdhfdslhfkdsf,sldkfhdslkhfdslkihfdslhflds
    voila il faut juste maintenant un faire un copier/coller et essayer de voir l'exécution.
    Merci.

  15. #35
    Membre habitué Avatar de Abacar94
    Homme Profil pro
    L2 Math-informatique
    Inscrit en
    Novembre 2015
    Messages
    103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Niger

    Informations professionnelles :
    Activité : L2 Math-informatique

    Informations forums :
    Inscription : Novembre 2015
    Messages : 103
    Points : 133
    Points
    133
    Par défaut
    les chaines de caractère se comporte de la même que les tableaux d'entier ou de réel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <stdio.h>    
    #include <string.h>    
    main()
    {char A[5];
     strcpy(A,"NIGER");
     printf("\nle caractère 1 est %c:",A[0]);   /* N */
     printf("\nle caractère 2 est %c:",A[1]);   /* I */
     printf("\nle caractère 3  est %c:",A[2]);  /* G */
     printf("\nle caractère 4 est %c:",A[3]);   /* E */
     printf("\nle caractère 5 est %c:",A[4]);   /* R */
    }
    sa donne la possibilité de parcourir la chaîne et de poser nos condition........dans le cas présent c'est quant
    on procèdes de traitement

  16. #36
    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 Abacar94 Voir le message
    les chaines de caractère se comporte de la même que les tableaux d'entier ou de réel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #include <stdio.h>    
    #include <string.h>    
    main()
    {char A[5];
     strcpy(A,"NIGER");
     printf("\nle caractère 1 est %c:",A[0]);   /* N */
     printf("\nle caractère 2 est %c:",A[1]);   /* I */
     printf("\nle caractère 3  est %c:",A[2]);  /* G */
     printf("\nle caractère 4 est %c:",A[3]);   /* E */
     printf("\nle caractère 5 est %c:",A[4]);   /* R */
    }
    sa donne la possibilité de parcourir la chaîne et de poser nos condition........dans le cas présent c'est quant
    on procèdes de traitement
    Non, c'est pas ça le problème.
    essaie le code et le fichier et tu verras.
    Merci

  17. #37
    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 vous avez essayer mon code les amis.
    car moi je suis bloqué vraiment je n'ai pas compris le problème c'est très étrange.
    la valeur "precedent" change tout seul à partir que fgets() prend seq10,.... logique elle doit prendre "precedent=seq9" mais elle change étrangement et prend "precedent=seq10"!!!!! et je ne sais pas pourquoi
    merci pour votre aide.

  18. #38
    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
    Relax max, c'est dimanche, les gens sont de sortie pour profiter du beau temps....... non j'déconne, il fait un temps pourri, j'étais au cinéma

    Déjà, je te confirme que ton code est très mal indenté. En voici une version corrigée (j'ai enlevé "windows.h" car je suis sous Mac et en plus il ne sert pas) :
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <math.h>
    #include <unistd.h>
     
    struct ligne
    {
    	char *qid;
    	char *sid;
    	int posin;
    	int posend;
    	char *qseq;
    	char *sseq;
    };
     
    int main()
    {
    	int TAILLE_MAX = 100000;
    	int Tailleligne = 600;
    	struct ligne ligne[Tailleligne];
    	FILE* fichier = NULL;
    	int i = 0;
     
    	for (i = 0; i < Tailleligne; i++)
    	{
    		ligne[i].posin = 0;
    		ligne[i].posend = 0;
    		ligne[i].qid = malloc(50 * sizeof(char*));
    		ligne[i].sid = malloc(50 * sizeof(char*));
    		ligne[i].qseq = malloc(100000 * sizeof(char*));
    		ligne[i].sseq = malloc(100000 * sizeof(char*));
    	}
     
    	char *chaine = NULL; // Chaîne vide de taille TAILLE_MAX
    	chaine = malloc(sizeof(char*) * 200000);
    	char *precedent;
    	char *interm;
    	interm = NULL;
    	precedent = NULL;
     
    	fichier = fopen("G:/test", "r");
    	int j = 0;
    	i = 0;
    	if (fichier == NULL)
    	{
    		// On affiche un message d'erreur si on veut
    		printf("File not found"); //      perror(msg);
    	}
    	while (fgets(chaine, TAILLE_MAX, fichier) != NULL)
    	{
    		sscanf(chaine, "%[^,],%[^,],%d,%d,%[^,],%[^\n]", ligne[i].qid,
    				ligne[i].sid, &ligne[i].posin, &ligne[i].posend, ligne[i].qseq,
    				ligne[i].sseq);
    		printf("****------------------------------------------------\n");
    		printf("i= %d \n", i);
    		printf("%s\n", ligne[i].qid);
    		printf("precedent:%s\n", precedent);
    		printf("****-------------------------------------------------\n");
     
    		if (precedent != NULL && strcmp(ligne[i].qid, precedent) != 0)
    		{
    			for (j = 0; j < i; j++)
    			{
    				printf("\n Ligne[%d]: %s", j, ligne[j].qid);
    			}
    			interm = ligne[i].qid;
    			i = 0;
    		}
    		if (interm != NULL)
    		{
    			ligne[i].qid = interm;
    			printf("\ninterm: %s\n", interm);
    			interm = NULL;
    		}
    		printf("i= %d \n", i);
    		printf("%s\n", ligne[i].qid);
    		precedent = ligne[i].qid;
    		printf("precedent: %s\n\n\n", precedent);
    		i++;
    	}
    	for (j = 0; j < i; j++)
    	{
    		printf("\n Ligne[%d]: %s", j, ligne[j].qid);
    	}
    	fclose(fichier);
    	return 0;
    }
    Des remarques plus ou moins dans l'ordre de lecture :

    1) Des mallocs de tailles importantes et tu ne vérifies pas les valeurs de retour ? Et si l'allocation échouait ?!

    2) Tu devrais mieux placer tes déclarations de variables. Tu utilises du C99 donc inutile de déclarer j une fois et de s'en servir à plusieurs. Tu peux créer "plusieurs j", un pour chaque boucle.

    3) Il y a des malloc(), mais pas de free(). Il faudra penser à les rajouter.

    4) Il y a beaucoup mieux que printf() pour déboguer un programme : un débogueur ! http://alexandre-laurent.developpez....e-application/

    Il n'y a pas qu'avec 9 que tu as un problème. J'ai l'impression que ton problème arrive quand il y a qu'une seule ligne pour une seq_id donné. Mais pour moi le plus gros problème est que je n'arrive pas à comprendre ton code. Les variables sont assez mal nommées, la logique n'est pas évidente, ce n'est pas découpé en fonctions, etc.

    Si j'ai suivi un peu ce qu'il y a avant dans cette discussion, tu souhaites récupérer un groupe de lignes qui on le même seq_id en les mettant dans un tableau, traiter le tableau, et enfin passer au seq_id suivant. C'est bien cela ? Si oui, pourquoi ne pas déjà commencer par être capable de lire le fichier et d'afficher le mot "changement" quand tu changes de seq_id ? Ca t'évitera la gestion du tableau et cela te fera te concentrer sur la logique de récupération depuis le fichier.

    Edit : un code qui fait ce travail de récupération, si tu veux voir comment j'ai fait. Il y a plusieurs choses intéressantes (j'espère ) dans ce code :

    1) Une structure de données plus juste par rapport au contenu du fichier. Sauf si je me suis laissé par abuser car je n'ai que 2 fichiers à ma disposition, les ID sont des entiers. Autant les lire comme des entiers car ça prend moins de place en mémoire et c'est plus facile à manipuler par la suite (un simple = au lieu d'un strcmp()). J'ai un seul champ de données car j'avais créé le type de structure avant les premiers exemples de données que tu avais donné.

    2) Des fonctions dédiées. J'ai une fonction pour afficher un enregistrement, j'ai une fonction pour récupérer un enregistrement. Cela permet d'isoler ces bouts de code pour les modifier facilement, et aussi cela permet d'alléger la boucle principale, faisant apparaitre la logique plus clairement.

    3) Le code est largement commenté et ces commentaires font apparaitre l'algo.

    4) Les noms de variables ne sont pas ambigües (en tout cas, j'espère les avoir fait clair pour tout le monde).

    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    #include <assert.h>
    #include <stdio.h>
    #include <stdbool.h>
     
    typedef struct
    {
    	int seq_id;
    	int ch_id;
    	int pos_id;
    	int end_id;
    	char data[512];
    } record_t;
     
    bool get_record(FILE* f, record_t* pr)
    {
     
    	//int n = fscanf(f, "seq_id%d,ch_id%d,pos%d,end%d,%s\n", &pr->seq_id,
    	//		&pr->ch_id, &pr->pos_id, &pr->end_id, pr->data);
     
    	int n = fscanf(f, "seq%d,contig%d,%d,%d,%[^\n]\n", &pr->seq_id,
    			&pr->ch_id, &pr->pos_id, &pr->end_id, pr->data);
     
     
    	return n == 5 ? true : false;
    }
     
    void print_record(record_t r)
    {
    	printf("Record = %d %d %d %d %s\n", r.seq_id, r.ch_id, r.pos_id, r.end_id, r.data);
     
    }
     
    int main(void)
    {
    	// Open file
    	FILE* f = fopen("dna.txt", "r");
    	assert(f);
     
    	// Array to store the records with the same seq_id
    	record_t array[20]; // size has to be adjusted
     
    	// Let's assume that 1 is the first seq_id in the file
    	int current_seq_id = 1;
     
    	// Variable to store the current record
    	record_t r;
     
    	// Variable to index 'array'
    	int i = 0;
     
    	// Handle each record in the file
    	while (get_record(f, &r))
    	{
    		//print_record(r);
     
    		// Test for a change of seq_id
    		if (r.seq_id != current_seq_id)
    		{
    			//puts("seq_id changes");
     
    			// Print the records for the seq_id that has just ended
    			printf("----- %d -----\n", current_seq_id);
    			for (int j = 0; j < i; j++)
    			{
    				print_record(array[j]);
    			}
     
    			// Reset array
    			i = 0;
    		}
     
    		// Store the current record
    		array[i] = r;
     
    		// Move to next record
    		current_seq_id = r.seq_id;
    		i++;
    	}
     
    	// Print the records for the last seq_id
    	// Indeed, the while loop exited without having a chance to detect a seq_id change when get_record() returned false
    	printf("----- %d -----\n", current_seq_id);
    	for (int j = 0; j < i; j++)
    	{
    		print_record(array[j]);
    	}
     
    	// All done \o/
    	puts("End");
    	return 0;
    }
    Enfin, un dernier conseil : dans la dure loi de la vie d'un développeur, il faut parfois savoir jeter un code qui ne marche pas et en écrire un autre tout neuf à partir d'une feuille blanche.

  19. #39
    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
    Merci pour ton aide.
    d'après mon programme et je pense que t'as vu son comportement la chose que j'ai pas pu la comprendre est le comportement de la vairable precedent quand fgets() prend seq10 est-ce t'as pu comprendre ça?
    dans ton code il y a une conversion en entier des seq_id mais moi j'ai des seq_id en chaine de caractère et ils ne sont pas de la forme seq_id.
    est-ce que je peux modifier ton code et laisser seq_id en chaine de caractère?
    Merci

  20. #40
    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
    Je pense que cela vient de ta gestion avec interm. Tu changes la valeur de interm quand tu changes de seq_id puis tu modifies la ligne lue avec la valeur de interm. Cette gestion semble compliquée et donc error prone. A quoi sert ce interm ?

    Comme je te l'ai dit, j'ai eu l'impression que seq_id était un nombre, à la vue des données d'exemple. Si ce n'est pas le cas, tu changes la structure et la fonction get_record() pour récupérer une chaine. Je te conseille aussi d'introduire une nouvelle fonction pour isoler la comparaison de seq_id, par exemple bool has_seq_id(record_t r, char *seq_id).

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