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 :

sauvegarder un tableau dans un fichier


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 25
    Points : 10
    Points
    10
    Par défaut sauvegarder un tableau dans un fichier
    bonjour tous le monde,

    Je suis nouveau sur le forum et débutant en programmation.
    J'essaie d'ecrire une fonction qui recois en parametre un pointeur sur un tableau a sauvegarder et une chaine de caractere correspondant au nom du fichier.

    Lors de la compilation j'ai une erreur "la valeur indicée n'est ni un tableau ni un pointeur"a la ligne 53.
    Je debute et je ne comprend pas le probleme.
    Si vous remarquez d'autres erreur dans le code, je suis ouvert a toutes suggestions.

    Merci




    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct 
        {
        unsigned int nb_colonnes;
        unsigned int nb_lignes;
        int *plan;    //pointeur sur le tableau de nb_lignes * nb_colonnes            
        } Un_tab2d;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Un_tab2d *creer_tab2d(unsigned int nb_lignes, unsigned int nb_colonnes){
     
    	Un_tab2d *tab=malloc(sizeof(Un_tab2d));
    	tab->nb_colonnes=nb_colonnes;
    	tab->nb_lignes=nb_lignes;
    	tab->plan=malloc(nb_colonnes*nb_lignes*(sizeof(int)));
     
    	return tab;
    }

    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
    void ecrire_tab2d(Un_tab2d *tab, char *nom_fichier){
     
        FILE *fic;
        int nb_li,nb_co;
        int *t;
        int i,j;
     
        fic=fopen(nom_fichier,"w");
        if (fic==NULL){
           fprintf(stderr,"Impossible d'ouvrir le fichier");
           exit (1);
        }
        t=tab->plan;
        nb_li=tab->nb_lignes;
        nb_co=tab->nb_colonnes;
     
        fprintf(fic,"%d\n",nb_li); //nombre de ligne du tableau
        fprintf(fic,"%d\n",nb_co ); //nombre de colonne du tableau
     
        for(i=0;i<nb_li;i++){
           for(i=0;j<nb_co;j++){
            fprintf(fic,"%d ",t[i][j]); //ligne 53 :erreur a la compilation
          }
           fprintf(fic,"\n");
        }
        fclose(fic);
     
    }
    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
     
    #include<stdio.h>
    #include"tab2d.h"
     
       int main()
       {
        Un_tab2d *tab;
        int nb_ligne=5;
        int nb_colonne=4;
        char *fic;
        fic="fichier.txt";
     
        tab=creer_tab2d(nb_ligne,nb_colonne);    
        ecrire_tab2d(tab,fic);
     
     
     
        return 0;
    }

  2. #2
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            fprintf(fic,"%d ",t[i][j]); //ligne 53 :erreur a la compilation
    t n'est pas un tableau 2D ni un tableau de pointeur sur int. Il a été déclaré comme tableau 1D :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct 
        {
        unsigned int nb_colonnes;
        unsigned int nb_lignes;
        int * plan;    //pointeur sur le tableau de nb_lignes * nb_colonnes            
        } Un_tab2d;
    En conséquence, t[i] a un sens (c'est un int) mais t[i][j] n'en a pas. Si tu veux un tableau 2D alors que tu as déclaré un tableau 1D, tu dois recalculer toi-même la position des éléments pour y accéder comme un tableau 1D. Ou alors, tu construits un tableau de pointeur qui te permettras d'écrire cette double indexation cf la FAQ "Comment allouer dynamiquement un tableau à 2 dimensions ?"

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 25
    Points : 10
    Points
    10
    Par défaut
    merci pour ta reponse

    la compilation a reussi mais c'est un tableau a une dimension qui s'ecrit sur le fichier texte.

    pourquoi???

    voici ce que j'ai modifié.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    t=malloc(nb_li*nb_co*sizeof(int));
     
    	for(i=0;i<nb_li*nb_co;i++){
     
    		fprintf(fic," %d ",t[i]);
    	  }

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 25
    Points : 10
    Points
    10
    Par défaut
    Est ce que ma fonction ,qui retourne un tableau de pointeur est bien definie?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Un_tab2d * creer_tab2d(unsigned int nb_lignes, unsigned int nb_colonnes){
     
    	Un_tab2d *tab=malloc(sizeof(Un_tab2d));
     
    	tab->plan=malloc(nb_colonnes*nb_lignes*(sizeof(int)));
    	tab->nb_colonnes=nb_colonnes;
    	tab->nb_lignes=nb_lignes;
     
    	return tab;
    }

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 31
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par jonezy0621 Voir le message
    Est ce que ma fonction ,qui retourne un tableau de pointeur est bien definie?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Un_tab2d * creer_tab2d(unsigned int nb_lignes, unsigned int nb_colonnes){
     
    	Un_tab2d *tab=malloc(sizeof(Un_tab2d));
     
    	tab->plan=malloc(nb_colonnes*nb_lignes*(sizeof(int)));
    	tab->nb_colonnes=nb_colonnes;
    	tab->nb_lignes=nb_lignes;
     
    	return tab;
    }
    Salut jonezy0621, ce n'est pas un tp de li215 ce programme ?
    c'est bien ca non le tme3.

    Oui c'est bien ca, elle est bien definie la fonction creer_tab2d

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 31
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par jonezy0621 Voir le message
    merci pour ta reponse

    la compilation a reussi mais c'est un tableau a une dimension qui s'ecrit sur le fichier texte.

    pourquoi???

    voici ce que j'ai modifié.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    t=malloc(nb_li*nb_co*sizeof(int));
     
    	for(i=0;i<nb_li*nb_co;i++){
     
    		fprintf(fic," %d ",t[i]);
    	  }

    c'est normal, deja dans l'exemple c'est un tableau d'une seule dimension qu'on utilise.

    ce qui est demandé dans l'exercice c'est d'afficher le tableau d'une seule dimension sous la forme d'un tableau de deux dimension.

    c'est facile : pour acceder à la valeur d'indice (i, j) de t
    il suffit d'ecire t[i * nb_colonnes + j] et donc l'affichage est comme la suite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
     for(i=0; i<nb_li; i++){
          for(i=0; j<nb_co; j++){
              fprintf(fic, "%d ",  t[i * nb_co + j]); 
          }
          fprintf(fic, "\n");
     }

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 25
    Points : 10
    Points
    10
    Par défaut
    merci pour les correction de mon code mais la quand j'execute le programme j'ai une erreur de segmentation. c'est quoi une "erreur de segmentation"?

    J'ai pas fait li205 c la premiere fois que je fais du C, alors excuse mon ignorance.

    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
    void ecrire_tab2d(Un_tab2d *tab, char *nom_fichier){
     
    	FILE *fic;
    	int nb_li,nb_co;
    	int *t;
    	int i,j;
     
    	fic=fopen(nom_fichier,"w");
    	if (fic==NULL){
    	   fprintf(stderr,"Impossible d'ouvrir le fichier");
    	   exit (1);
    	}
    	nb_li=tab->nb_lignes;
    	nb_co=tab->nb_colonnes;
     
    	fprintf(fic,"%d\n",nb_li);
    	fprintf(fic,"%d\n",nb_co);
     
    	for(i=0;i<nb_li;i++){
    	   for(i=0;i<nb_co;j++) {
       		   fprintf(fic,"%d",t[i*nb_co+j]);
    	  }
    	fprintf(fic,"\n");
    	}
    	fclose(fic);
    }

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 31
    Points : 28
    Points
    28
    Par défaut
    Citation Envoyé par jonezy0621 Voir le message
    merci pour les correction de mon code mais la quand j'exécute le programme j'ai une erreur de segmentation. c'est quoi une "erreur de segmentation"?

    J'ai pas fait li205 c la première fois que je fais du C, alors excuse mon ignorance.

    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
    void ecrire_tab2d(Un_tab2d *tab, char *nom_fichier){
     
    	FILE *fic;
    	int nb_li,nb_co;
    	int *t;
    	int i,j;
     
    	fic=fopen(nom_fichier,"w");
    	if (fic==NULL){
    	   fprintf(stderr,"Impossible d'ouvrir le fichier");
    	   exit (1);
    	}
    	nb_li=tab->nb_lignes;
    	nb_co=tab->nb_colonnes;
     
    	fprintf(fic,"%d\n",nb_li);
    	fprintf(fic,"%d\n",nb_co);
     
    	for(i=0;i<nb_li;i++){
    	   for(j=0;i<nb_co;j++) {
       		   fprintf(fic,"%d",t[i*nb_co+j]);
    	  }
    	fprintf(fic,"\n");
    	}
    	fclose(fic);
    }
    l'erreur de segmentation ne vient pas de cette fonction car je l'ai testé sur mon projet et elle marche parfaitement.

    voila une petite explication sur ce que peut être l'erreur de segmentation : http://www.developpez.net/forums/d66...-segmentation/

    Autre chose le li205 c'est rien du tout, si tu comprends tme2 et tme3 t'aura tout compris en li205, bon courage jonezy0621.

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 31
    Points : 28
    Points
    28
    Par défaut
    si tu veux montre moi la fonction lire_tab2d et le main et j'essaierai de trouvé l'erreur de segmentation.

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 25
    Points : 10
    Points
    10
    Par défaut
    j'ai trouvé l' erreur dans la boucle interne.j'ai mis i=0 au lieu de j=0.

    merci pour tes conseils, a bientot Msakemi.

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

Discussions similaires

  1. sauvegarder les données d'un tableau dans un fichier texte
    Par soumer dans le forum Interfaces Graphiques
    Réponses: 16
    Dernier message: 18/09/2011, 19h13
  2. Sauvegarder un tableau dans un fichier
    Par Truxs dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 09/01/2010, 16h46
  3. Réponses: 3
    Dernier message: 24/01/2007, 23h40
  4. [arbre] Sauvegarder un objet dans un fichier
    Par Guigui_ dans le forum Langage
    Réponses: 6
    Dernier message: 07/02/2003, 00h55
  5. Sauvegarder une surface dans un fichier
    Par Freakazoid dans le forum DirectX
    Réponses: 6
    Dernier message: 18/08/2002, 15h23

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