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 :

Mettre les lignes d'un fichier dans un tableau


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 101
    Points : 53
    Points
    53
    Par défaut Mettre les lignes d'un fichier dans un tableau
    je cherche à lire sur stdin toutes les lignes d'une fichier et de les stocker dans un tableaux.
    J'ai fait ça mais ça a pas l'air de marcher très bien!
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define NMAXLINE 100
    #define NMAXCHAR 100
     
    int main()
    {
    	char row[NMAXCHAR];
    	char* lines[NMAXLINE];
    	char* test;
    	int nbLine=0,i;
    	test=fgets(row,NMAXLINE,stdin);
    	/*Stockage des lignes*/
            while(test!=NULL)
    	{
    		lines[nbLine]=row;
    		test=fgets(row,NMAXLINE,stdin);
    		nbLine++;
    	}
            /*Affichage des lignes stockées*/
    	for(i=0;i<nbLine;i++)
    	{
    		fprintf(stdout,lines[i]);
    		printf("\n");
    	}
    	return EXIT_SUCCESS;
    }
    Q'en pensez vous ?
    Rod

  2. #2
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       for(i=0;i<nbLine;i++)
       {
          fprintf(stdout,lines[i]);
          printf("\n");
       }
    est à revoir.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut Re: Mettre les lignes d'un fichier dans un tableau
    Citation Envoyé par rod59
    je cherche à lire sur stdin toutes les lignes d'une fichier et de les stocker dans un tableaux.
    J'ai fait ça mais ça a pas l'air de marcher très bien!
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    #define NMAXLINE 100
    #define NMAXCHAR 100
     
    int main()
    {
    	char row[NMAXCHAR];
    	char* lines[NMAXLINE];
    	char* test;
    	int nbLine=0,i;
    	test=fgets(row,NMAXLINE,stdin);
    	/*Stockage des lignes*/
            while(test!=NULL)
    	{
    		lines[nbLine]=row;
    		test=fgets(row,NMAXLINE,stdin);
    		nbLine++;
    	}
            /*Affichage des lignes stockées*/
    	for(i=0;i<nbLine;i++)
    	{
    		fprintf(stdout,lines[i]);
    		printf("\n");
    	}
    	return EXIT_SUCCESS;
    }
    Q'en pensez vous ?
    Rod
    Il n'y a pas création spontanée de memoire ... Si chaque ligne doit être stockée séparément, il faut de l'espace pour chaque ligne. Ici, tu te contentes de remplir un tableau de pointeurs avec l'adresse du même tableau. D'autre part, avec *printf(), il faut utiliser une formateur "%s" lorsque la variable chaine n'est pas explicite. On ne sais pas ce qu'il peut y avoir dedans...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       fprintf(stdout,"%s"lines[i]);
    et forcer la sortie si on est pas sûr qu'il y a un '\n' dans la chaine...
    Pas de Wi-Fi à la maison : CPL

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par troumad
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       for(i=0;i<nbLine;i++)
       {
          fprintf(stdout,lines[i]);
          printf("\n");
       }
    est à revoir.
    Pourquoi ?
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Rédacteur/Modérateur
    Avatar de troumad
    Homme Profil pro
    Enseignant
    Inscrit en
    Novembre 2003
    Messages
    5 597
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 5 597
    Points : 7 832
    Points
    7 832
    Par défaut
    Je ne comprends pas l'utilité de mélanger le fprintf et le printf. Peut-être pour brouiller la lecture. C'est d'ailleur ce que ça m'a fait je n'avais pas remarqué que sa sortie était stdout, j'avais cru que c'était un FILE * quelconque.
    Modérateur Mageia/Mandriva Linux
    Amicalement VOOotre
    Troumad Alias Bernard SIAUD à découvrir sur http://troumad.org
    Mes tutoriels : xrandr, algorigramme et C, xml et gtk...

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 101
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par troumad
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
       for(i=0;i<nbLine;i++)
       {
          fprintf(stdout,lines[i]);
          printf("\n");
       }
    est à revoir.
    Pourquoi ?
    suis d'accord avec Emmanuel! Pourquoi ca ne va pas?
    Mon algo c'est de lire ligne par ligne avec fgets, au fur et à mesure je remplis mon tableau lines et ensuite je le reparcours pour voir si il a bien été rempli.
    La 2ème boucle sert juste à vérifier que la 1ère à bien fait son travail.rien de plus.

    Sinon :
    Citation Envoyé par Emmanuel Delahaye
    Il n'y a pas création spontanée de memoire ... Si chaque ligne doit être stockée séparément, il faut de l'espace pour chaque ligne. Ici, tu te contentes de remplir un tableau de pointeurs avec l'adresse du même tableau.
    Ce que tu ve dire c'est que à chaque tour de boucle je stocke le pointeur d'une chaine que je n'est pas stockée en mémoire?
    Faut-il faire un malloc à chaque tour boucle?

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par rod59
    Faut-il faire un malloc à chaque tour boucle?
    Oui. fgets() se contente de retourner l'adresse passée en paramètre ou NULL en cas de fin de lecture.
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 101
    Points : 53
    Points
    53
    Par défaut
    Donc ca ca pourrait marcher ?
    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
     
    int main() 
    { 
       char* row; 
       char* lines[NMAXLINE]; 
       char* test; 
       int nbLine=0,i;
       row=(char*)malloc(NMAXCHAR*sizeof(char));
       test=fgets(row,NMAXLINE,stdin);  
       while(test!=NULL) 
       { 
          lines[nbLine]=row;
          row=(char*)malloc(NMAXCHAR*sizeof(char)); 
          test=fgets(row,NMAXLINE,stdin); 
          nbLine++; 
       }

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par rod59
    Donc ca ca pourrait marcher ?
    sizeof (char) valant 1 par définition, et le cast étant inutile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
          row = malloc(NMAXCHAR);
    par contre, attention, malloc() peut échouer...

    Ensuite, tu as supprimé le tableau de pointeurs. Pourquoi ? Il faut bien mémoriser l'adresse des blocs alloués, non ?
    Pas de Wi-Fi à la maison : CPL

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 101
    Points : 53
    Points
    53
    Par défaut
    bah mon tableau de pointeur c'est lines!
    Je l'utilise tjs ?!
    Sinon pourquoi malloc peut échouer?

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par rod59
    bah mon tableau de pointeur c'est lines!
    Je l'utilise tjs ?!
    Ok, mal lu. Désolé. Il y a quand même un problème, c'est que tu ne stockes pas le dernier row alloué. C'est dû à ton algo plutôt tordu. Tu n'as probablement besoin de fait 2 fgets(). Un seul suffit si la boucle est mieux écrite...
    Sinon pourquoi malloc peut échouer?
    Par manque de ressource. On ne peut pas allouer de la mémoire indéfiniment...
    Pas de Wi-Fi à la maison : CPL

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 101
    Points : 53
    Points
    53
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Il y a quand même un problème, c'est que tu ne stockes pas le dernier row alloué.
    Je pense que si!

    Emmanuel : On avait déjà eu cette discussion sur un autre topic!
    Quand je serai sur le dernière ligne fgets va me le retourner et le prochain appel sera à null.
    Donc je ne perd aucun information,je pense,mais je peut me tromper

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par rod59
    Citation Envoyé par Emmanuel Delahaye
    Il y a quand même un problème, c'est que tu ne stockes pas le dernier row alloué.
    Je pense que si!

    Vu que tu sauvegardes avant le malloc(), je ne vois pas comment... Ou alors tu ajoutes une sauvegarde après la boucle... C'est bien compliqué...

    Emmanuel : On avait déjà eu cette discussion sur un autre topic!
    Quand je serai sur le dernière ligne fgets va me le retourner et le prochain appel sera à null.
    Donc je ne perd aucun information,je pense,mais je peut me tromper
    Fait les tests avec un traqueur de mémoire... (efence, valgrind, purify etc. ou mon sysalloc http://emmanuel-delahaye.developpez.com/clib.htm)
    Pas de Wi-Fi à la maison : CPL

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    101
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 101
    Points : 53
    Points
    53
    Par défaut
    +1
    Désolé! Voilà c corrigé

  15. #15
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    C'est quand mêm un peu du n'importe quoi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
      while(test!=NULL)
       {
          lines[nbLine]=row;
          row=(char*)malloc(NMAXCHAR*sizeof(char));
          test=fgets(row,NMAXLINE,stdin);
          nbLine++;
       }
    Tu alloues NMAXCHAR et tu lis NMAXLINE.
    Tu devrait peut-être faire ainsi :

    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
    int main(void)
    {
       char* row;
       char* lines[NMAXLINE];
       char* test;
       int nbLine=0,i;
       row=malloc(NMAXCHAR);
        if (row == NULL)
       {
          fprintf(stderr, "Pb alloc memoire\n");
          return EXIT_FAILURE; 
       }
       // ne sert à rien
       // test=fgets(row,NMAXLINE,stdin); 
       while(fgets(row,NMAXCHAR,stdin); !=NULL)
       {
          // On peut faire lines[nbLine++]=row;
          lines[nbLine]=row;
          row=malloc(NMAXCHAR);
          if (row == NULL)
          {
            fprintf(stderr, "Pb alloc memoire\n");
            break;; 
          }
           // Si on n'a pas fait lines[nbLine++]=row;
          // devrait être remonté avant le malloc à cause de la sortie éventuelle
          // de la boucle
          nbLine++;
       } 
       // il ne faudra pas oublier de libérer le dernier row alloué et le tableau Lines
       ....................
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

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

Discussions similaires

  1. mettre les valeur d'un range dans un tableau
    Par calvi2002 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/07/2009, 12h50
  2. Réponses: 51
    Dernier message: 06/01/2008, 16h47
  3. Comment mettre les lignes d'un fichier dans un tableau en shell
    Par Ombrius dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 23/10/2006, 12h34
  4. Réponses: 4
    Dernier message: 26/01/2006, 14h37
  5. Réponses: 4
    Dernier message: 24/04/2003, 22h28

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