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 :

UNION et fichier.


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 16
    Par défaut UNION et fichier.
    je me rappelle plus comment on fait quand dans un fichier j'ai une structure du genre

    octet 0-100 nom
    octet 100-200 addresse
    octet 200-205 code postal
    ...

    je me rappelle qu'une facon simple est de faire une structure

    struct s_header
    {
    char nom[100];
    char addresse[100];
    char codepostal[5];
    }


    et ensuite de faire une union

    union u_header
    {
    struct s_header;
    char // la le bas blesse
    }

    mais sachant que je pense utiliser fgets pour faire des entree bufferise.

    je me rappelle plus quoi mettre dans l'union pour pourvoir confomdre ma structure avec les octets lu du fichier.

    en esperant avoir ete clair avec mon probleme.

    Cordialement.

  2. #2
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Je sais pas si c'est autorisé, mais ceci pourrait être sympa

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    union u_header
    {
      struct s_header;
      char data_header[sizeof (struct s_header)];
    };

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 16
    Par défaut
    oui mais ce que j'arrive pas a faire c'est que j'ai un char* (s) que j'obtiens avec fgets et la je le confondre avec ma struct
    si je fais

    union u_headers u;

    u.data_header = s;
    la ca marche pas.

    donc si vous avais une idee.

  4. #4
    Membre Expert
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    C'est parceque les langages plus évolués t'ont fait prendre l'habitude de manipuler des types chaine alors qu'en C il n'y a pas vraiment de type "chaine"
    Juste des pointeurs qui pointent vers des zones contenant une serie de caractere terminée par \0

    Pour copier une chaine dans une zone c'est strcpy()

  5. #5
    Membre chevronné
    Avatar de NewbiZ
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2002
    Messages
    184
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2002
    Messages : 184
    Par défaut
    J'ai pas de compilateur sous la main, alors je promets rien.
    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
     
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef
    struct
    {
          char nom[100];
          char addresse[100];
          char codepostal[5];
    } header_t;
     
    void LoadFromFile( const char* filename, header_t* buffer)
    {
         FILE* file = NULL;
     
         if ((file = fopen(filename, "rb")) == NULL)
         {
                    printf("LoadFromFile: Erreur de chargement du fichier.\n");
                    return;
         }
     
         fread(file, sizeof(header_t), 1, buffer);
     
         fclose(file);
    }
     
    void SaveToFile( const char* filename, header_t* buffer)
    {
         FILE* file = NULL;
     
         if ((file = fopen(filename, "wb")) == NULL)
         {
                    printf("SaveToFile: Erreur d'ecriture du fichier.\n");
                    return;
         }
     
         fwrite(buffer, sizeof(header_t), 1, file);
     
         fclose(file);
    }
     
    void LoadFromString (const char* data, header_t* buffer)
    {
         buffer = (header_t*)data;
    }
     
    int main(int argc, char *argv[])
    {
      header_t header;
     
      LoadFromFile("fichier.txt", &header);
      LoadFromString("ceci est une chaine", &header);
      SaveToFile("fichier2.txt", &header);
     
      system("PAUSE");	
      return 0;
    }

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 16
    Par défaut
    Merci les gars je vais tester ca ;-)

  7. #7
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Quelques remarques :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
         if ((file = fopen(filename, "rb")) == NULL)
    Le fichier est ouvert en binaire, plus embêtant à regarder son bon fonctionnement que si on commence en mode texte...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
         {
                    printf("LoadFromFile: Erreur de chargement du fichier.\n");
                    return;
         }
    Erreur de conception, le return; ne devrait pas être utilisé. Ceci est une fonction qui peut planter, ce serait bien de retourner un entier pour le signaler.

    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
     
    void SaveToFile( const char* filename, header_t* buffer)
    {
         FILE* file = NULL;
     
         if ((file = fopen(filename, "wb")) == NULL)
         {
                    printf("SaveToFile: Erreur d'ecriture du fichier.\n");
                    return;
         }
     
         fwrite(buffer, sizeof(header_t), 1, file);
     
         fclose(file);
    }
    Mêmes remarques...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void LoadFromString (const char* data, header_t* buffer)
    {
         buffer = (header_t*)data;
    }
    Pas de cast en C. On peut s'en passer et c'est source d'erreurs... Cette fonction est fausse.

    En C, on ne modifie pas les paramètres que les zones pointées...

    Ceci fonctionnerait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void LoadFromString (const char* data, header_t* buffer)
    {
         memcpy( buffer, data , sizeof(header_t));
    }
    Jc

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 16
    Par défaut
    Merci les gars ca marche.

  9. #9
    Membre chevronné
    Avatar de NewbiZ
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2002
    Messages
    184
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2002
    Messages : 184
    Par défaut
    Le fichier est ouvert en binaire, plus embêtant à regarder son bon fonctionnement que si on commence en mode texte...
    C'est à dire ? "son bon fonctionnement".

    Erreur de conception, le return; ne devrait pas être utilisé. Ceci est une fonction qui peut planter, ce serait bien de retourner un entier pour le signaler.
    Désolé, instinct C++iens, d'habitude je préfère conserver la valeur de retour de la fonction pour autre chose, et envoyer une exception en cas de problème, ca permet d'éviter un gros switch et de gérer les erreurs indépendamment de la ou on apelle la fonction.

  10. #10
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par NewbiZ
    C'est à dire ? "son bon fonctionnement".
    C'est plus facile, après l'écriture d'un fichier de le lire avec un bloc note s'il est écrit en mode texte

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

Discussions similaires

  1. Union sur plusieurs fichiers
    Par Invité dans le forum Développement de jobs
    Réponses: 4
    Dernier message: 14/05/2012, 15h00
  2. union de deux fichiers
    Par siempre dans le forum C
    Réponses: 1
    Dernier message: 19/09/2009, 12h03
  3. union sur des fichiers séquentiel
    Par Florian.L dans le forum C
    Réponses: 3
    Dernier message: 25/03/2007, 15h13
  4. Réponses: 2
    Dernier message: 08/03/2007, 01h49
  5. fichier mappé en mémoire
    Par WinBernardo dans le forum Delphi
    Réponses: 7
    Dernier message: 01/12/2006, 09h38

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