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 :

Récupérer le contenu d'un fichier + vider un char *


Sujet :

C

  1. #1
    Membre actif
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Points : 271
    Points
    271
    Par défaut Récupérer le contenu d'un fichier + vider un char *
    Bonjour,

    Je suis en train d'essayer de récupérer le contenu d'un fichier qui est structuré comme ceci: J'ai créé deux tableaux, un pour les mots et un autre pour les définitions. Pour le moment je rencontre deux problèmes:
    • Je ne parviens pas à vider un char * avant d'écrire dedans
    • Et j'ai un segmentation fault après un strncat (p-e lié au premier problème)


    Pour le premier problème, j'ai essayé en placant comme premier caractère un \0. Evidemment, ça ne peut marcher puisque je fais un strcat après. Et j'ai essayé en copiant "" mais là, il n'aime pas non plus. Voici ce que me dit gdb:
    Program received signal SIGSEGV, Segmentation fault.
    0x080485af in file2tables (dico=6, mots=0xbfea1e54, definitions=0xbfea1e2c) at serveur.c:45
    45 strcpy(mots[i],"");
    Si je ne vide pas les char *, j'ai des caractère bizarres avant et après mes mots. Quand je ne le fais pas, j'obtiens ceci:
    Program received signal SIGSEGV, Segmentation fault.
    0xb7e18de7 in strncat () from /lib/tls/i686/cmov/libc.so.6
    Voici mon code:
    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
    void file2tables(int dico, char * mots[NB_MOTS], char * definitions[NB_MOTS]){
      char lettre; 
      int nbchar;
      int numMot = 0;
      int mot =1; //definition = 0
      int i;
     
      //Vide les tableaux
      for (i =0; i<NB_MOTS;i++){
        strcpy(mots[i],"");
        strcpy(definitions[i],"");
        //  mots[i][0] = '\0';
        //definitions[i][0] ='\0';
      }
     
      do{
        nbchar = read(dico,&lettre,1);
        if (nbchar == 1){
          if (lettre == ':'){
    	mot = 0;
          }
          if (lettre == '\n'){
    	mot = 1;
    	numMot ++;  
          }
     
          if (mot){
    	if (lettre != '\n'){
    	  strncat(mots[numMot],&lettre,1);
    	}
          }
          else{
    	if (lettre != ':'){
    	  strncat(definitions[numMot],&lettre,1);
    	}
          }
        }
      }while(nbchar >0);
     
      for (i=0;i<NB_MOTS;i++)
        printf("Mot: %s \nDefinition: %s\n",mots[i],definitions[i]);
     
    }
    J'ai une contrainte: utiliser les appels sytèmes: donc pas de fopen, fread, fgets,...

    Merci d'avance pour votre aide.

    P.S: Je suis sur Ubuntu.
    Utilisez les balises "Code" (alt+c).
    Nous avons répondu à votre question? Pensez au tag

    Le "lol" est aux boulets ce que le ";" est aux programmeurs

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 603
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 603
    Points : 17 913
    Points
    17 913
    Billets dans le blog
    2
    Par défaut
    d'abord, as-tu alloué tes tableaux Mots et Définitions ?

    Ensuite, strncat prend une chaîne, et tu lui passes l'adresse d'un caractère. Et comme c'est un caractère et non une chaîne, ça ne se termine pas par '\0'.
    Il faut donc le rajouter.. Et tant qu'à faire autant se passer de strcat...


    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 l = 0 ;
    .....
    .....
     
      do{
        nbchar = read(dico,&lettre,1);
        if (nbchar == 1){
          if (lettre == ':'){
    	mot = 0;
            l = 0 ;
          }
         else
          if (lettre == '\n'){
    	mot = 1;
            l = 0 ;
    	numMot ++;  
          }
         else
          if (mot) {
    	  mots[numMot][l] = lettre ;
              l = l + 1 ;
     	  mots[numMot][l] = '\0' ;
         }
          else{
    	  definitions[numMot][l] = lettre ;
              l = l + 1 ;
     	  definitions[numMot][l] = '\0' ;
          }
        }
      }while(nbchar >0);
    "Un homme sage ne croit que la moitié de ce qu’il lit. Plus sage encore, il sait laquelle".

    Consultant indépendant.
    Architecture systèmes complexes. Programmation grosses applications critiques. Ergonomie.
    C, Fortran, XWindow/Motif, Java

    Je ne réponds pas aux MP techniques

  3. #3
    Membre actif
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Points : 271
    Points
    271
    Par défaut
    Effectivement, c'est une autre façon de faire.

    Mais il reste un stut:
    Program received signal SIGSEGV, Segmentation fault.
    0x080485e3 in file2tables (dico=6, mots=0xbfc8fc44, definitions=0xbfc8fc1c) at serveur.c:57
    57 mots[numMot][l] = lettre;
    Les tableaux mots et definitions sont déclarés dans le main comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char * mots[NB_MOTS];
    char * definitions[NB_MOTS];
    Et l'appel à la fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    file2tables(dictionnaire, mots, definitions);
    Je ne peux quand même pas faire de malloc sans connaître la taille de mots et definitions, si?
    Utilisez les balises "Code" (alt+c).
    Nous avons répondu à votre question? Pensez au tag

    Le "lol" est aux boulets ce que le ";" est aux programmeurs

  4. #4
    Membre actif Avatar de femtosa
    Inscrit en
    Juin 2002
    Messages
    253
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 253
    Points : 222
    Points
    222
    Par défaut
    Citation Envoyé par v4np13
    Je ne peux quand même pas faire de malloc sans connaître la taille de mots et definitions, si?
    Tu es obligé d'allouer de l'espace pour tes mots ! Tes tableaux contiennes des pointeurs, tu dois les intialiser !

    Si tu ne connais pas la taille des mots, peut-être peux-tu te fixer une taille limite ... C'est une solution simpliste possible si tu n'es pas à l'octet près ...
    "L'expérience est le seul livre que les imbéciles savent lire ... !"

    Qui à dit cela ? Moi je n'sais pas !
    Mais en tout cas, je l'applique au pas !

  5. #5
    Membre actif
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Points : 271
    Points
    271
    Par défaut
    Voila, le problème est résolu, un grand merci à vous.
    Utilisez les balises "Code" (alt+c).
    Nous avons répondu à votre question? Pensez au tag

    Le "lol" est aux boulets ce que le ";" est aux programmeurs

  6. #6
    Membre actif Avatar de femtosa
    Inscrit en
    Juin 2002
    Messages
    253
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 253
    Points : 222
    Points
    222
    Par défaut
    Juste par curiosité, comment ... ? Une taille maximal fixe ... ?
    "L'expérience est le seul livre que les imbéciles savent lire ... !"

    Qui à dit cela ? Moi je n'sais pas !
    Mais en tout cas, je l'applique au pas !

  7. #7
    Membre actif
    Homme Profil pro
    Analyste/développeur Java EE
    Inscrit en
    Janvier 2005
    Messages
    376
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste/développeur Java EE

    Informations forums :
    Inscription : Janvier 2005
    Messages : 376
    Points : 271
    Points
    271
    Par défaut
    Comme ceci avec des malloc:

    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 ** mots = NULL;
    char ** definitions = NULL;
    int i;
     
    //Allocation de la mémoire
    mots = (char **)malloc(NB_MOTS*sizeof(char *));  
    definitions = (char **)malloc(NB_MOTS*sizeof(char *)); 
    if ((mots == NULL) || (definitions == NULL)){
      perror("Erreur d'allocation de mémoire");
      return -1;
    }
    for (i= 0; i<NB_MOTS; i ++){
      mots[i] = NULL;
      definitions[i] = NULL;
      mots[i] = (char *)malloc(20*sizeof(char));
      definitions[i] = (char *)malloc(40*sizeof(char));
      if ((mots[i] == NULL) || (definitions[i] == NULL)){
        perror("Erreur d'allocation de mémoire");
        return -1;
      }
    }
     
    //Libération de la mémoire
    for (i = 0; i<NB_MOTS; i ++){
      free(mots[i]);
      free(definitions[i]);
    }
    free(mots);
    free(definitions);
    Utilisez les balises "Code" (alt+c).
    Nous avons répondu à votre question? Pensez au tag

    Le "lol" est aux boulets ce que le ";" est aux programmeurs

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

Discussions similaires

  1. [File] récupérer le contenu d'un fichier
    Par kendras dans le forum C
    Réponses: 31
    Dernier message: 19/06/2006, 12h33
  2. Réponses: 5
    Dernier message: 10/04/2006, 12h07
  3. Aide : Décoder, récupérer le contenu d'un fichier .pst
    Par ATTIA dans le forum API, COM et SDKs
    Réponses: 10
    Dernier message: 23/03/2006, 16h11
  4. Comment récupérer le contenu de plusieurs fichiers textes ?
    Par calimero2611 dans le forum Langage
    Réponses: 9
    Dernier message: 19/02/2006, 15h45
  5. [ethereal] récupérer le contenu d'un fichier envoyé ?
    Par in dans le forum Développement
    Réponses: 1
    Dernier message: 19/06/2005, 15h44

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