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 :

problème d'allocation de tableau


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    392
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 392
    Par défaut problème d'allocation de tableau
    Bonsoir,

    Je voulais copier le contenu de fichier "exemple.txt" dans un tableau dynamique tab de taille inconnue en avance. J'utilise le tableau pour faciliter la manipulation après.
    Chaque ligne de fichier contient une chaine de caractère :
    nom
    prenom
    age
    adresse
    emploi

    Voici le programme:
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include<string.h>
    int allocation(int N) 
     {
    	FILE *fp;
    	char *t,s[100],attribut[32];
    	int i;
     
    	t = (char *) malloc((N)*sizeof(char));
    	fp=fopen("exemple.txt","r");
     
    	for(i=0; i < N;i++)
            {
    	 fgets(s, 100, fp);
             sscanf(s,"%s",attribut);	
    	 strcpy(t[i],attribut);
    	 printf("%s ",t[i]);
    	}
     
          fclose(fp);
           return 0;
     }
     
    int main ()
    {
    FILE *fp = NULL;
    char s[100];
    int N=0;
    //N est calculer : c'est le nombre des lignes de fichier "attribut.txt" puisque chaque ligne de ce fichier contient un attribut qui est l'objet de la combinaison
    while (fgets(s,100,fp)!= NULL)
    N++;
    allocation(N);
    fclose(fp);
    return 0;
    }
    J'ai remarqué que le problème déclenche juste après l'ouverture de fichier "attribut.txt" dans la fonction allocation(N).
    Comment on résoudre ce problème ?

    Je serais très reconnaissant pour vos aides.

    Merci.

  2. #2
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par siempre Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    FILE *fp = NULL;
     
    ....
     
    while (fgets(s,100,fp)!= NULL)
    Lorsque tu appelles fgets(), tu n'as ouvert aucun fichier et fp vaut donc NULL.

  3. #3
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    392
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 392
    Par défaut
    Bonsoir,

    Le même problème. Voici le programme modifié:
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int allocation(int N) 
     {
    	FILE *fp;
    	char *t,s[100],attribut[32];
    	int i;
     
    	t = (char *) malloc((N)*sizeof(char));
    	fp=fopen("exemple.txt","r");
    	rewind(fp);
     
    	for(i=0; i < N;i++)
            {
    	 fgets(s, 100, fp);
             sscanf(s,"%s",attribut);	
    	 strcpy(t[i],attribut);
    	 printf("%s ",t[i]);
    	}
     
          fclose(fp);
           return 0;
     }
     
    int main ()
    {
    FILE *fp = NULL;
    char s[100];
    int N=0;
    fp=fopen("exemple.txt","r");
     
    while (fgets(s,100,fp)!= NULL)
    N++;
    fclose(fp);
    allocation(N);
     
    return 0;
    }
    Merci.

  4. #4
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par siempre Voir le message
    Bonsoir,

    Le même problème. Voici le programme modifié:
    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
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int allocation(int N) 
     {
    	FILE *fp;
    	char *t,s[100],attribut[32];
    	int i;
     
    	t = (char *) malloc((N)*sizeof(char));
     
    ...
     
    	 strcpy(t[i],attribut);
    	 printf("%s ",t[i]);
     
    ...
    Le type de t est char*, donc le type de t[i] est char, ce qui n'est pas correct.

    Au passage, je m'étonne que ce code puisse compiler :

    ||=== test_DVP, Release ===|
    E:\projet\test_DVP\main.c||In function `allocation'
    E:\projet\test_DVP\main.c|18|warning: implicit declaration of function `strcpy'|
    E:\projet\test_DVP\main.c|18|error: passing arg 1 of `strcpy' makes pointer from integer without a cast|
    E:\projet\test_DVP\main.c|19|warning: format argument is not a pointer (arg 2)|
    ||=== Build finished: 1 errors, 2 warnings ===|
    Sans compter que les erreurs ne sont pas gérées par ce programme (test de malloc() et fopen(), vérification des tailles, vérification de la complétude des lignes lues, etc.)

  5. #5
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    392
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 392
    Par défaut
    Bonjour,

    Le type de t est char*, donc le type de t[i] est char, ce qui n'est pas correct.
    t est un tableau de chaine de caractère. on ne sait pas en avance ta taille de tableau.

    Je voulais copier le contenu du fichier dans un tableau.
    Voici mon essai:
    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
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int allocation(int N)  
     {
    	FILE *fp;
    	char *t,s[100],attribut[32];
    	int i,j;
     
    	t = (char *) malloc(N*sizeof(char)); 
    	if(t== NULL)
    {
    	printf("probleme d'allocation\n");
    	exit(0);
    } 
    	fp=fopen("exemple.txt","r");
     
    if (fp == NULL)
    {
    	printf("impossible d'ouvrier le fichier\n");
    	exit(0);
    }
    	rewind(fp);
    //copier le contenu du fichier dans le tableau
    	for(i=0; i < N;i++)
        {
    	    fgets(s, 100, fp);
            sscanf(s,"%s",attribut);	
    	    strcpy(t[i],attribut);
     
    	}
     
         //affichage le contenu de tableau
    	  for(j=0;j<N;j++)
    		  printf("j=%d %s\n",j,t[j]);
     
    	   fclose(fp);
           return 0;
     }
     
    int main(void)
    {
     FILE *fp = NULL;
     char s[100];
     int N=0;
     fp=fopen("exemple.txt","r");
     if (fp == NULL)
     {
    	printf("impossible d'ouvrier le fichier\n");
    	exit(0);
     }
    while (fgets(s,100,fp)!= NULL)
    N++;
    fclose(fp);
    allocation(N);
      return 0;
    }
    Mais, l'exécution ne passe pas bien !!

    Merci

  6. #6
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par siempre Voir le message
    t est un tableau de chaine de caractère. on ne sait pas en avance ta taille de tableau.
    Non, "char *t" déclare un pointeur sur char. Une fois l'allocation faite, t pointe sur un tableau de caractère (qui pourra représenté une chaîne de caractère), pas sur un tableau de chaîne de caractère.

    D'ailleurs comme indiqué dans mon message précédent, le compilateur remonte une erreur (je ne vois d'ailleurs pas comment tu pourrais bien exécuter ce code qui ne compile pas) sur :


  7. #7
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    392
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 392
    Par défaut
    Non.l'affichage nous donne toute la chaine et n'est pas une lettre de chaine
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main()
    {
    char *t[5]={"lundi","mardi","mars","avril","dimanche"};
    int i;
    for(i=0;i<5;i++)
    printf("%s\n",t[i]);
      return 0;
    }
    Le tableau est déclaré ici statiquement.
    mon problème comment je vais allouer le tableau t où on va copier le contenu du fichier.

    Voici mon essai:
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    int allocation(int N)  
     {
            FILE *fp;
            char *t,s[100],attribut[32];
            int i,j;
     
            t = (char *) malloc(N*sizeof(char)); 
            if(t== NULL)
    {
            printf("probleme d'allocation\n");
            exit(0);
    } 
            fp=fopen("exemple.txt","r");
     
    if (fp == NULL)
    {
            printf("impossible d'ouvrier le fichier\n");
            exit(0);
    }
            rewind(fp);
    //copier le contenu du fichier dans le tableau
            for(i=0; i < N;i++)
        {
                fgets(s, 100, fp);
            sscanf(s,"%s",attribut);        
                //strcpy(t[i],attribut);
                    strcpy(t+i,attribut);
    printf("%s\n",t+i);
            }
     
         //affichage le contenu de tableau
              for(j=0;j<N;j++)
                       printf("j=%d %s\n",j,t+j);
               fclose(fp);
           return 0;
     }
     
    int main(void)
    {
     FILE *fp = NULL;
     char s[100];
     int N=0;
     fp=fopen("exemple.txt","r");
     if (fp == NULL)
     {
            printf("impossible d'ouvrier le fichier\n");
            exit(0);
     }
    while (fgets(s,100,fp)!= NULL)
    N++;
    fclose(fp);
    allocation(N);
      return 0;
    }
    Je vois que la partie suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        for(i=0; i < N;i++)
        {
                fgets(s, 100, fp);
            sscanf(s,"%s",attribut);        
                //strcpy(t[i],attribut);
                    strcpy(t+i,attribut);
    printf("%s\n",t+i);
            }
    nous donne :
    lundi
    mardi
    mars
    avril
    dimanche

    Donc chaque case du tableau t contient une chaine du caractère.

    J'ai remarqué que l'allocation se passe bien et l'ouverture du fichier se passe bien pas des messages d'erreur.
    Mais la partie suivante du programme ne s'exécute pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //affichage le contenu de tableau
    	  for(j=0;j<N;j++)
    	           printf("j=%d %s\n",j,t+j);

Discussions similaires

  1. Problème d'allocation de tableau dynamique
    Par DuffNut dans le forum Langage
    Réponses: 4
    Dernier message: 26/10/2011, 11h17
  2. Réponses: 5
    Dernier message: 06/07/2011, 15h35
  3. Réponses: 4
    Dernier message: 25/03/2010, 22h11
  4. [Débutant][Win32] Problème d'allocation de tableau de FILE
    Par Patchanka dans le forum Visual C++
    Réponses: 8
    Dernier message: 06/04/2009, 10h49
  5. Réponses: 5
    Dernier message: 06/02/2007, 09h26

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