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 :

Demande de conseil (fwrite)


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 464
    Par défaut Demande de conseil (fwrite)
    Hey !

    J'ai une question technique...


    Imaginons un tableau à 2 dimensions d'entiers :

    Dans le cours du programme, il est initialisé, rempli et tout et tout...
    Puis, je désire le sauvegarder d'un coup dans un fichier. Est-ce que cette syntaxe est correcte ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ....
     
    fwrite( &graphe, sizeof( int** ), 1, f );
     
    ....

    Merci !

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Mike888
    Imaginons un tableau à 2 dimensions d'entiers :

    Donc, un tableau dynamique... OK.
    Dans le cours du programme, il est initialisé, rempli et tout et tout...
    Puis, je désire le sauvegarder d'un coup dans un fichier. Est-ce que cette syntaxe est correcte ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ....
    fwrite( &graphe, sizeof( int** ), 1, f );
    ....
    La syntaxe n'est pas en cause. La programmation, c'est pas du hasard. Si le tableau est créé, il a des dimensions. Il faut donc se servir ce ces valeurs pour faire les boucles qui vont bien et enregistrer les valeurs ligne par ligne (de tableau).

    Je te signale quand même qu'enregistrer des données binaires directement dans un fichier est certes techniquement possible, mais absolument pas portable. Une modification d'une option de compilation peut, malgré la même machine, le même système et le même compilateur, rendre le fichier illisible.

    On préfère enregistrer les données sous forme de texte, facilement lisible et dont la lecture est assez simple et surtout beaucoup plus portable. Le format CSV est une manière courante de faire. Pour des valeurs , un simple fichier 'space' peut suffire.

    Dans les deux cas, une organisation en 1 ligne de texte par une ligne de tableau est le plus simple et le plus clair.

    exemple : un tableau de 3 x 4 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    1 2 3 4
    5 6 7 8
    9 10 11 12
    http://emmanuel-delahaye.developpez....s.htm#fichiers

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 464
    Par défaut
    Okay Emmanuel

    Mais en fait, je dois le sauver en binaire et en texte. Et pour le moment, je m'occupe du binaire !


    Donc, ma façon de taper le tableau d'un coup dans le fichier est correcte en théorie mais en pratique trop dangereuse...
    Je dois donc boucler et copier les valeurs case par case alors... Est-ce bien cela ?

    Ceci me semble correct :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      for ( i = 0; i < taille; i++ )
      {
        for ( j = 0; j < taille; j++ )
        {
          fwrite( &(graphe[i][j]), sizeof( int ), 1, f );
        }
      }

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Mike888
    Mais en fait, je dois le sauver en binaire et en texte. Et pour le moment, je m'occupe du binaire !
    OK, c'est de la perte de temps, mais allons-y... admettons que ce soit à but pédagogique...
    Donc, ma façon de taper le tableau d'un coup dans le fichier est correcte en théorie mais en pratique trop dangereuse...
    Non. Fausse à 100%, car ce n'est pas un "tableau d'entiers à 2 dimensions", mais un tableau de pointeurs sur de tableaux d'entiers (le tout, alloué dynamiquement)
    Je dois donc boucler et copier les valeurs case par case alors... Est-ce bien cela ?
    Oui.
    Ceci me semble correct :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      for ( i = 0; i < taille; i++ )
      {
        for ( j = 0; j < taille; j++ )
        {
          fwrite( &(graphe[i][j]), sizeof( int ), 1, f );
        }
      }
    Oui, mais est-tu sûr que le tableau 2D est carré ?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    464
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Décembre 2003
    Messages : 464
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Non. Fausse à 100%, car ce n'est pas un "tableau d'entiers à 2 dimensions", mais un tableau de pointeurs sur de tableaux d'entiers (le tout, alloué dynamiquement)
    Ah... Et quelle aurait été l'écriture correcte alors ?

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Mike888
    Ah... Et quelle aurait été l'écriture correcte alors ?
    Encore une fois, ce n'est pas la syntaxe (ce que tu appelles "l'écriture") qui est cause, mais la méthode. Celle que tu as proposé après (les 2 boucles) est correcte.

  7. #7
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Mike888
    Ah... Et quelle aurait été l'écriture correcte alors ?
    Ton tableau à deux dimensions n'en est pas un...

    Tu as défini un pointeur sur pointeur sur int.

    Un pointeur sur un type quelconque peut aussi pointer sur un tableau unidimentionnel de ce type. Je suppose que c'est l'usage que tu en as. Donc tu as un pointeur sur un tableau unidimentionnel de pointeur sur tableau unidimentionnel de int.

    Il n'y a pas d'écriture correcte pour écrire une telle chose en une fois. Chacun des tableaux de int pouvant être séparé des autres -- et s'il est joint, l'ordre pourrait ne pas être celui auquel tu t'attends.

    Pour avoir un vrai tableau à 2 dimensions en C, une des dimensions (la deuxième) doit être connue à la compilation, l'autre pouvant être gérée par la caractéristique des pointeurs donnée ci-dessus.

    Alors pt est un pointeur vers tableau de TABSIZE int et peut être initialisé pour pointer vers un tableau de tableau de TABSIZE int.

    Si tu veux un tableau garanti d'un bloc et avec les 2 dimentions dynamiques, tu dois l'allouer d'une pièce:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int * pt = malloc(SIZEL*SIZEC*size(int));
    mais tu dois y accéder en calculant les indices toi-même. Si tu veux garder la syntaxe pt[l][c] tu peux allouer un tableau de int* que tu initialises pour pointer à l'intérieur de ce bloc.

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

Discussions similaires

  1. Demande de conseil pour migration de lignes vers colonnes
    Par ririd dans le forum Administration
    Réponses: 6
    Dernier message: 04/11/2004, 17h02
  2. [Struts_Tiles VS CSS] Demande de Conseils
    Par sylvain_neus dans le forum Struts 1
    Réponses: 4
    Dernier message: 16/04/2004, 10h12
  3. [sqlbaseserver]demande de conseils/aides pour requêtes
    Par GéniuS77 dans le forum Langage SQL
    Réponses: 14
    Dernier message: 18/03/2004, 17h27
  4. demande de conseil
    Par stephane eyskens dans le forum EDI/Outils
    Réponses: 2
    Dernier message: 25/09/2003, 14h18

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