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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 25
    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 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
            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 averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 25
    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 averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 25
    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
    Membre averti
    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
    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
    Membre averti
    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
    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");
     }

+ 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