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 :

lecture tableau de char


Sujet :

C

  1. #1
    Membre éclairé
    Inscrit en
    Juin 2007
    Messages
    284
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 284
    Par défaut lecture tableau de char
    Bonjour,

    J'ai fait un prog qui lit des valeurs à partir d'un fichier.
    Voila le 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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main ()
    {
      int i, l;
      FILE *src = NULL;
      FILE *f = NULL;
      int size[12];
      int taille;
      char* mot;
      char* tab[12];
     
    src = fopen ("huffman_DC.txt", "r");
    f = fopen("test.txt", "w");
     
    if((src == NULL) || (f == NULL))
    {
           printf("pb ouverture fichier\n");
    }
     
    for (i=0;i<12;i++)
    {
    	fscanf(src,"%d %s", &taille, mot);
        	fprintf(f, "%s", mot);
    	size[i] = taille;
    	tab[i] = mot;
    	printf("voila le mot de code %d %s \n", i, tab[i]); 
    }
     
    printf("voila tab mot %s \n", tab[4]); 
     
      fclose(src);
      fclose(f);
    Pour le premier printf, les valeurs affichées sont correctes (correspond à ce que j'ai dans le fichier) Par Contre pour le 2eme printf (affichage de tab[4]), il m'affiche la dernière valeur insérée dans le tableau. Je ne comprend pas d'où ca vient!!!

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    Par défaut
    Le pointeur mot n'est pas initialisé: Il peut pointer sur n'importe quoi.
    Comportement indéfini.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre éclairé
    Inscrit en
    Juin 2007
    Messages
    284
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 284
    Par défaut
    mot est un pointeur qui me permet de lire le fichier. tu me suggère de l'initialiser à NULL.
    Sinon je ne vois pas le rapport avec mon pb!!
    Merci

  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
    ouinih :
    tu me suggère de l'initialiser à NULL.
    Ce n'est pas du tout ce que te suggères Médinoc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
      char* mot;
    ....
    	fscanf(src,"%d %s", &taille, mot);
    Pour stocker une chaîne de caractères, il faut un tableau de char, pas un char*. C'est la définition de mot qui est incorrecte, il FAUT que mot soit un tableau (suffisamment grand) de char

  5. #5
    Membre chevronné Avatar de corentin59
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 462
    Par défaut
    il faut que tu alloues de la mémoire pour mot : soit tu le déclares comme celaauquel cas tu auras un tableau de 100 caractères, soit tu utilises malloc() (sans oublier free())

  6. #6
    Membre éclairé
    Inscrit en
    Juin 2007
    Messages
    284
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 284
    Par défaut
    j'ai fait ce que vous me demander, mais j'ai tjrs le meme pb: l'execution du prog donne la meme chose

  7. #7
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    tab non plus n'est pas initialisé. Plutôt que d'utiliser des pointeurs utilise plutôt des tableaux comme ça t'auras moins de problèmes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main ()
    {
        ...
        char mot[100];
        char tab[12][100];
        ...
        return 0;
    }
    A part ça (rien à voir avec ton problème) tu gères mal les erreurs d'ouverture de fichiers. En cas d'erreur on termine le programme, alors que toi tu affiches un message mais continue quand même l'exécution ...

    EDIT : J'ai répondu trop vite. En fait, j'ai lu le programme et je constate que tu copies mot dans tab[i] à chaque itération. Pour copier une chaîne il faut utiliser strcpy. Copier une chaîne et pointer sur une chaîne (comme tu le fais) ne sont pas la même chose. Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    char s[100];
    char * p;
     
    strcpy(s, "bonjour"); /* on met "bonjour" dans s */
    p = s; /* p pointe sur s */
    strcpy(s, "au revoir"); /* maintenant s contient "au revoir" */
     
    printf("%s\n", p); /* affiche "au revoir" ! */
    En effet, p n'est pas une chaîne mais simplement un pointeur. Dans l'exemple il pointe sur s.

    En résumé, utilise des tableaux.

  8. #8
    Membre éclairé
    Inscrit en
    Juin 2007
    Messages
    284
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 284
    Par défaut
    en faisant comme tu dis le reste du code ne change pas.
    La j'ai une eurreur de compilation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    binaire_jeudi.c:42: erreur: incompatible types in assignment
    Merci

  9. #9
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par ouinih Voir le message
    en faisant comme tu dis le reste du code ne change pas.
    La j'ai une eurreur de compilation
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    binaire_jeudi.c:42: erreur: incompatible types in assignment
    Merci
    Remplace tab[i] = mot par strcpy(tab[i], mot). On ne peut pas faire <tableau> = <quoi que ce soit>.

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

Discussions similaires

  1. retrouver unesuite de caractères dans un tableau de char
    Par petitours dans le forum C++Builder
    Réponses: 17
    Dernier message: 12/07/2005, 23h43
  2. Ansistring et tableau de char
    Par rabbi_jaccob dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/12/2004, 11h51
  3. [Collections] lecture tableau 2 dimensions
    Par heloise dans le forum Collection et Stream
    Réponses: 2
    Dernier message: 30/09/2004, 10h49
  4. Adresse d'un tableau de char
    Par Trap D dans le forum C
    Réponses: 8
    Dernier message: 23/12/2003, 12h02
  5. Réponses: 4
    Dernier message: 10/10/2003, 18h04

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