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 :

envoyer une structure dans un fichier et le comparer.


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 14
    Points : 17
    Points
    17
    Par défaut envoyer une structure dans un fichier et le comparer.
    Bonsoir,

    Je souhaite envoyer sur le port série une structure de cette manière:
    timeSend = time (NULL);
    res = fwrite(&timeSend, sizeTime, 1, fd);

    et le récupérer ainsi:
    res = fread(&timeRecept, sizeTime, 1, fd);

    sauf que j'ai lu là --> http://www.usenet-fr.net/fur/comp/lang/faq-c-2.html :
    "6.6 Comment lire/écrire des structures dans des fichiers ?
    Il faut utiliser les fonctions fread() et fwrite().
    Attention : les fichiers obtenus ne sont pas portables."

    Quelqu'un a une idée en quoi les fichiers ne seront pas portables ?

    J'aimerais utiliser write plutôt que fwrite.
    Est-ce une erreur sachant que je souhaite envoyer mes données sur le port série et socket réseau ?




    Plus gênant, je voulais comparer deux structures avec un truc du genre:
    if (memcmp (&timeSend, &timeRecept, sizeTime) !=0 )

    sauf que, toujours à la même adresse, j'ai:
    "6.5 Comment comparer deux structures ?
    Il n'existe pas en C d'opérateur ou de fonction pour comparer deux structures.
    Il faut donc le faire à la main, champs par champs.
    Une comparaison bit à bit n'est pas portable, et risque de ne pas
    marcher, en raison du padding (alignement sur certains octets)."

    A part déstructurer les données ou de tester champ par champ, comment procédez vous pour manipuler vos structures ?

    Merci.

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 14
    Points : 17
    Points
    17
    Par défaut
    Juste un complément pour dire que je suis allé voir la time.h.

    La manipulation des structures semblant poser un problème sous C,
    la réponse des programmeurs semble être d'avoir opté à une inflation de fonctions.
    J'ai donc utilisé la ligne de comparaison suivante :
    if (difftime (timeSend, timeRecept))

  3. #3
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Attention : les fichiers obtenus ne sont pas portables."

    Quelqu'un a une idée en quoi les fichiers ne seront pas portables ?
    Le contenu du fichier est une copie du contenu de la mémoire à l'instant où on a écrit la structure or la représentation des données en mémoire varie d'une plateforme à une autre. Il existe plusieurs méthodes pour faire des entrées/sorties vers des fichiers de manière portable (lire par exemple : Enregistrer une structure).

    J'aimerais utiliser write plutôt que fwrite.
    Est-ce une erreur sachant que je souhaite envoyer mes données sur le port série et socket réseau ?
    write n'est pas une fonction normalisée par l'ISO, c'est fwrite qui l'est. Mais vu ce que tu as envie de faire, tu n'as pas vraiment le choix. Pour les sockets cependant, il est préférable d'utiliser recv et send (portables) plutôt que read et write (unix-likes uniquement).

    Plus gênant, je voulais comparer deux structures avec un truc du genre:
    if (memcmp (&timeSend, &timeRecept, sizeTime) !=0 )

    sauf que, toujours à la même adresse, j'ai:
    "6.5 Comment comparer deux structures ?
    Il n'existe pas en C d'opérateur ou de fonction pour comparer deux structures.
    Il faut donc le faire à la main, champs par champs.
    Une comparaison bit à bit n'est pas portable, et risque de ne pas
    marcher, en raison du padding (alignement sur certains octets)."

    A part déstructurer les données ou de tester champ par champ, comment procédez vous pour manipuler vos structures ?
    Il n'y a pas d'autre moyen, à part peut être de créer une fonction de comparaison (champ par champ ...) par structure !

    J'ai donc utilisé la ligne de comparaison suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (difftime(timeSend, timeRecept))
    Attention, diffitme est une fonction de la bibliothèque standard du C. Tu dois trouver un autre nom pour ta fonction perso. Ou c'est bien la fonction difftime du C ?

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    14
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 14
    Points : 17
    Points
    17
    Par défaut
    Il n'y a pas d'autre moyen, à part peut être de créer une fonction de comparaison (champ par champ ...) par structure !
    ...
    Attention, diffitme est une fonction de la bibliothèque standard du C. Tu dois trouver un autre nom pour ta fonction perso. Ou c'est bien la fonction difftime du C ?
    - Je souhaite bien utiliser la fonction C diffTime déjà faite.

    - Pas de solution miracle.
    Je vais démembrer mes structures, utiliser les routines de conversion htlon, chaque fois que j'enverrais des données numériques entre machines différentes.

    Le texte, lui, risque de me poser problème.
    Je souhaite utiliser les caractères de contrôle.
    S'il me faut les encoder, j'utiliserais peut être la bibliothèque pointée par ton lien ou peut être j'utiliserai le Glibc qui semble proposer un encodage.

    Merci de ta réponse et de ton lien que je vais m'appliquer d'étudier.

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

Discussions similaires

  1. Envoyer une structure dans un fichier .txt
    Par floflo87 dans le forum C
    Réponses: 6
    Dernier message: 23/04/2013, 17h40
  2. Réponses: 9
    Dernier message: 04/06/2007, 21h44
  3. Réponses: 17
    Dernier message: 09/03/2007, 18h13
  4. stocker une structure dans un fichier ini?
    Par Mickey.jet dans le forum C
    Réponses: 6
    Dernier message: 13/09/2006, 16h57
  5. copier une structure dans un fichier
    Par brute dans le forum MFC
    Réponses: 18
    Dernier message: 10/03/2006, 14h30

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