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 :

Comment stocker chaque ligne d'un fichier dans un tableau


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 89
    Par défaut Comment stocker chaque ligne d'un fichier dans un tableau
    Bonjour,

    Bon je suis sur un petit problème en C, et j'aimerais connaitre d'autres avis afin que je puisse m'en sortir !!!

    En fait ce que je souhaite faire c'est lire un fichier et stocker chaque ligne de ce fichier dans un tableau de chaîne de caractères ... En concret j'aimerais donc avoir un tableau de chaine de caractère: char **tabC et donc pour tabC[i][j] i représenterais chaque ligne du fichier et j chaque caractère de la ligne i !!!!!

    Si vous avez une proposition en c avec un beau fgets où quelque ce soit, n'hésitez pas, car je suis vraiment en lutte avec mon prog !!!!

    Thankssssssss en espérant avoir des réponses très rapidement

  2. #2
    Membre expérimenté
    Profil pro
    Dev
    Inscrit en
    Décembre 2007
    Messages
    191
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations professionnelles :
    Activité : Dev

    Informations forums :
    Inscription : Décembre 2007
    Messages : 191
    Par défaut
    Si tu as deja fait des essais, donne-les, ici le style de la maison ce n'est pas de donner des solutions "toutes faites". Tu pourras recevoir de l'aide, mais montre quand même que tu passes plus de temps sur ton programme que les utilisateurs du forum qui te lisent .

    Meme un code erroné (et dis nous qu'est ce que tu en comprends pas dans tes erreurs). Tu as parlé de fgets, et bien pourquoi pas ? Qu'y a t-il de problématique avec ? As-tu lu la FAQ C à propos des fonctions pour lire des chaines de caractères / fichiers ? (lien en haut de la page).

    EDIT : est-ce que les lignes de ton fichiers ont le meme nombre de caractères ou pas ? Bien evidemment ce sera beaucoup plus simple si oui.

  3. #3
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 89
    Par défaut
    Ok je vais mettre mon code, et en ce qui concerne ta question toutes les lignes du fichier n'ont pas la même longueur.

    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
     
    f=fopen(argv[1],"r");
     
    		k=0;
     
    		while(fgets (s2, 2000, f)!=NULL)
     
    		{
     
    			if(((s2[0] ==' ')||(s2[0]=='-')))
     
    			{
     
    				i=0;
     
    				while( (s2[i+1]!=' ') && (s2[i+2]!= '0'))
     
    				{
     
    					Conjonction[k][i] = s2[i];
     
    					//printf("%s",Conjonction[1]);
     
    					printf("%s",s2);
     
    					i++;
     
    				}
     
    				k++;
     
    			}
     
    		}
    Voilà mais je comprends pas pourquoi lors de l'execution j'ai un beau bus error, sachant que le tableau Conjonction est un tableau dynamique : char **Conjonction et qu'il est alloué juste avant, l'allocation est bonne.

    Le soucis apparemment c'est qu'à cause de la première boucle while tout le fichier est enregistré dans le tableau de caractère s2, donc faudrait changer ça mais je sais pas trop vers quoi m'orienter !!!

  4. #4
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    		k=0;
     		while(fgets (s2, 2000, f)!=NULL)
     		{
     			if(((s2[0] ==' ')||(s2[0]=='-')))
     			{
    ....
    				k++;
    			}
     		}
    k++ ne semble pas correctement placé. Si c'est le cas, un telle erreur est facilement évitée par une indentation correcte du code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while( (s2[i+1]!=' ') && (s2[i+2]!= '0')) ....
    est-ce '0' ou 0 ????
    Comment est détectée la fin de la ligne S2?

  5. #5
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 89
    Par défaut
    bah dans mon cas la fin d'une ligne est marquée par le caractère 0 précédé d'un espace d'où le if.

    Quant au k++ il est correctement placé car l'indice k du tableau conjonction sera incrémenté à chaque fois qu'une ligne est traitée.

    Mais ce que je ne comprends vraiment pas c'est que lors de l'execution ça me sort un "bus error" et d'après plusieurs test c'est l'affection Conjonction[k][i] = s2[i]; qui ne lui plait pas.

    Mais pourquoi ? conjonction est définie comme étant un char **, et s2 comme un char *. Et k est initialisé avant ... COMPRENDS POOO !! j'suis sur que c'est un truc en bois encore ....

  6. #6
    Membre confirmé
    Inscrit en
    Décembre 2007
    Messages
    89
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 89
    Par défaut
    Pour faire un test pour voir si ça venait de mon allocation dynamique pour conjonction j'ai crée un tableau conjonction définie comme suit :
    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
    // TEEEEEEEESSSSSSSSSTTTTTTTTTT
     
    		char conjonction[_conj_C][_conj_L];
     
    		for(i=0;i<_conj_C;i++)
     
    			for(j=0;i<_conj_L;j++)
     
    			{
     
     
     
    					conjonction[i][j] = 'a' ;
     
    					printf("a");
     
    			}
    Et le résultat de ça c'est que ça me fait les printf jusqu'à arriver à un Segmentation Fault ... Hmmm Aurai-je trouver le point névralgique ???

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    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 bartmanb Voir le message
    En fait ce que je souhaite faire c'est lire un fichier et stocker chaque ligne de ce fichier dans un tableau de chaîne de caractères ... En concret j'aimerais donc avoir un tableau de chaine de caractère: char **tabC et donc pour tabC[i][j] i représenterais chaque ligne du fichier et j chaque caractère de la ligne i !!!!!
    Le tableau dynamique est vide !
    Allouer quelques pointeurs (disons 8)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    nb_lin = 8;
    char *pp = malloc (sizeof *pp * nb_lin);
    lin = 0;
    allouer un bloc de, disons 32 colonnes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    nb_col = 32;
    pp[lin] = malloc(sizeof *pp[lin] * nb_col;
    lire la ligne courante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fgets(pp[lin], nb_col, fp);
    chercher et tuer le \n
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    char *p = strchr(pp[lin], '\n');
    if (p != NULL)
    {
       *p = 0;
        /* terminer (ligne suivante) */
        /* si on atteint le nombre de ligne, on agrandi (double, nombre d'or...) */
    }
    else
    {
        /* agrandir la ligne avec realloc() (double, nombre d'or...)*/
        /* recommencer */
    }
    Il n'y a plus qu'à mettre ça en forme. Sujet intéressant (quoique classique ).

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 15/04/2008, 00h38
  2. comment stocker les données d'une hashtable dans un fichier?
    Par mokh7 dans le forum Entrée/Sortie
    Réponses: 9
    Dernier message: 02/04/2008, 02h31
  3. Réponses: 13
    Dernier message: 20/11/2006, 17h46
  4. 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
  5. Réponses: 14
    Dernier message: 19/11/2005, 18h56

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