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 :

Donner une adresse à Fwrite


Sujet :

C

  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 Donner une adresse à Fwrite
    Hi !

    J'ai un petit souci avec fwrite.

    Imaginons une structure composé de plusieus champs int et qqes autres float. Cette structure est sauvegardée dans un fichier.
    Je dois à certains moments mettre certains champs de ma structure à jour (1 à la fois dans mon cas).
    Comment faire pour dire à fwrite de ne copier que le nième champ de ma structure et pas toute celle-ci ?

    Un exemple:

    -> Dans le cours du programme, le champ milieu a été mis à jour et je dois sauver cette mise à jour dans le fichier, sans changer les autres champs. Autrement dit, comment lui donner l'adresse de ce champ ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct xyz
    { int debut, avant, milieu, apres, fin;
      float a,b,c;
    };
    Merci !

  2. #2
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut Re: Donner une adresse à Fwrite
    Citation Envoyé par Mike888
    Hi !

    J'ai un petit souci avec fwrite.

    Imaginons une structure composé de plusieus champs int et qqes autres float. Cette structure est sauvegardée dans un fichier.
    Je dois à certains moments mettre certains champs de ma structure à jour (1 à la fois dans mon cas).
    Comment faire pour dire à fwrite de ne copier que le nième champ de ma structure et pas toute celle-ci ?

    Un exemple:

    -> Dans le cours du programme, le champ milieu a été mis à jour et je dois sauver cette mise à jour dans le fichier, sans changer les autres champs. Autrement dit, comment lui donner l'adresse de ce champ ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct 
    { int debut, avant, milieu, apres, fin;
      float a,b,c;
    };
    Merci !
    Ou la pas belle structure, deja elle a pas de nom??
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    struct 
    {
      int debut;
      int avant;
      int milieu;
      int apres;
      int fin;
      float a;
      float b;
      float c;
    }MaStruct;
    Imaginons
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    struct MaStruct a;
    Pour fwrite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    fwrite(&a.fin, sizeof a.fin, 1, fichier);

  3. #3
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Ce que tu racontes n'est pas limpide, mais je comprends que tu ecris une structure dans un fichier, puis tu modifies cette structure et tu souhaites ecrire la version modifiée. Admettons.
    Mettre à jour un fichier, c'est casse gueule. Le plus simple est de fermer le fichier (s'il est encore ouvert), puis de le ré-ouvrir et réécrire la structure en entier. S'il le faut, tu peux aussi renommer l'ancien fichier pour avoir la version N-1 également.

  4. #4
    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
    Sisi, j'ai vite rajouté un nom en meme que tu postais ...

    En fait, j'avais imaginé cette possibilité mais je savais absolument pas si c'était valable ...

  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 DaZumba
    Ce que tu racontes n'est pas limpide, mais je comprends que tu ecris une structure dans un fichier, puis tu modifies cette structure et tu souhaites ecrire la version modifiée. Admettons.
    Mettre à jour un fichier, c'est casse gueule. Le plus simple est de fermer le fichier (s'il est encore ouvert), puis de le ré-ouvrir et réécrire la structure en entier. S'il le faut, tu peux aussi renommer l'ancien fichier pour avoir la version N-1 également.
    Non, le fichier est closé après chaque opération de lecture - ecriture ...
    Je sais bien que c'est mieux de copier la structure entière d'un coup mais dans mon cas, c'est pas possible... D'où ma question.

  6. #6
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par Mike888
    Sisi, j'ai vite rajouté un nom en meme que tu postais ...

    En fait, j'avais imaginé cette possibilité mais je savais absolument pas si c'était valable ...
    Ma solution n'ecrit que un champs dans le fichier, la methode de Dazumba reste quand meme mieux.
    Réecrire totalement la structure dans le fichier.

  7. #7
    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 Re: Donner une adresse à Fwrite
    Citation Envoyé par Mike888
    J'ai un petit souci avec fwrite.
    Imaginons une structure composé de plusieus champs int et qqes autres float. Cette structure est sauvegardée dans un fichier.
    Je dois à certains moments mettre certains champs de ma structure à jour (1 à la fois dans mon cas).
    Comment faire pour dire à fwrite de ne copier que le nième champ de ma structure et pas toute celle-ci ?
    Il y a des bricolages possibles avec des modes d'ouverture tordus (pas toujours supportés par les OS, fseek() etc.

    La solution 'canonique' est de recopier le fichier enregistrement par enregistrement (taille fixe, format binaire, on est d'accord ?), de modifier 'à la volée' celui qui nous interesse, et de le recopier ainsi modifié.

    C'est plus lent sur les gros fichiers, mais ça préserve le fichier original (on peut annuler la modif) et ça évite les risques de destruction (Ecriture / Lecture sur un fichier précieux de 200Mo, ça fout la trouille).

    Dans l'industrie, on utilise des bases de données qui gèrent tout ça en transparence totale pour l'utiisateur (MySQL, SQLLite, PostgreSQL etc.)

  8. #8
    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
    Bon, c'est encore moi ...

    Donc (bien que vous n'aimiez pas ça), je continue avec ma mise à jour de fichier.


    J'ai une structure composée de différents champs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct resultats
    {
      int matric;
      float qualg, quaju, quato, m1lg, m1ju, m1to, m2lg, m2ju, m2to, general;
    };
    - A un moment dans mon programme, je rentre des données dans plusieurs champs (les 4 premiers).
    -> Suite à cela, je copie ma structure dans un fichier (en fait, c'est un tableau de structure, mais ça revient au meme...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fwrite( & tabresul[i], sizeof( struct resultats ), 1, f );
    - Un peu plus tard, je rentre des données dans les 3 champs suivants (donc les champs 5 à 7).
    -> Je désire à nouveau copier les champs mis à jour dans mon fichier mais ATTENTION, sans effacer le contenu existant de mon fichier. Je refais un (donc, une mise à jour en quelque sorte) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fwrite( & tabresul[i], sizeof( struct resultats ), 1, f );

    Et là, c'est la cata; la dernière écriture efface le contenu du fichier. Pourant j'ai bien ouvert mon fichier en mise à jour avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    f = fopen( s_chemin, "r+b" );

    Où pourrait se situer mon erreur ???
    Dois-je faire une écriture champ par champ ? Ce serait un peu fastidieux !

  9. #9
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    SI tu veux ajouter des données en fin de fichier il faut ouvrir avec le mode append ( +a).

    Si tu veux mettre à jour un enregistrement dans un fichier, il te faut alors te déplacer là où se trouve ton enregistrement dans le fichier ( fseek).

Discussions similaires

  1. Réponses: 1
    Dernier message: 11/01/2013, 20h17
  2. Donner une adresse de site
    Par Bebete dans le forum Débuter
    Réponses: 2
    Dernier message: 30/06/2008, 11h27
  3. Donner une adresse à un site intranet
    Par casawi dans le forum Apache
    Réponses: 1
    Dernier message: 04/07/2007, 14h56
  4. commande dos pour résoudre une adresse ip
    Par stephy dans le forum Développement
    Réponses: 2
    Dernier message: 17/12/2002, 14h04
  5. Comment récupérer une adresse MAC ?
    Par psau dans le forum Développement
    Réponses: 7
    Dernier message: 19/07/2002, 17h26

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