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 .txt


Sujet :

C

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Envoyer une structure dans un fichier .txt
    Bonjour,

    J'ai une petite question, j'ai une structure de type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct{
        int a;
        char B;
        float c;
    } Structure_a
    mais ma structure est bien plus longue et a des structures intégrées.

    Je voudrais savoir s'il y a un moyen simple (car pour l'instant j'ai trouvé que des moyens compliqués) pour faire une sauvegarde de ma structure dans un fichier .txt .

    Merci par avance

  2. #2
    Membre expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Points : 3 528
    Points
    3 528
    Par défaut
    Il y a eu un grand débat là dessus il y a quelques semaines...
    De ce que j'ai retenu : tu "peux" faire un fwrite et un fread pour la stocker et la lire sans vraiment savoir ce qu'il se passe...
    Et tu risques d'avoir des problèmes si tu changes entre une machine 32 bits et 64 bits pour la lecture/écriture avec le même fichier.

    Ou alors tu dois faire une fonction qui écrit chaque champ entre des séparateurs, et une fonction qui lit entre chaque séparateur.

  3. #3
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 137
    Points
    23 137
    Par défaut
    Bonjour,

    Citation Envoyé par Metalman Voir le message
    Il y a eu un grand débat là dessus il y a quelques semaines...
    De ce que j'ai retenu : tu "peux" faire un fwrite et un fread pour la stocker et la lire sans vraiment savoir ce qu'il se passe...
    Et tu risques d'avoir des problèmes si tu changes entre une machine 32 bits et 64 bits pour la lecture/écriture avec le même fichier.

    Ou alors tu dois faire une fonction qui écrit chaque champ entre des séparateurs, et une fonction qui lit entre chaque séparateur.
    Pas besoins de séparateurs si on écrit tout en binaire avec pour les nombres 1 octet écrit = 1 octet du nombre, il suffit juste de passer par des hton et des types dont les tailles ne changent pas comme int8_t ou uint64_t.

    Après, si on écrit les nombres avec 1 caractère écrit = 1 chiffre en base 10 du nombre, on peut avoir deux choix :
    - Soit on utilise en effet des séparateurs ;
    - Soit on donne une "taille" fixe aux nombres en rajoutant des caractères (ex : printf("%5.5d, monEntier)).

    Si le but est juste de stocker des informations, je te conseille de tout écrire en binaire.
    Si le but est de pouvoir comprendre et éditer le fichier, peut-être que les XML pourraient t'intéresser.

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 382
    Points : 41 590
    Points
    41 590
    Par défaut
    Le posteur originel a dit explicitement ".txt" dans son message et le titre, toute mention écriture binaire est donc hors-sujet.

    Je dirais que le plus intuitif est de faire une fonction pour chaque structure, qui écrira son contenu. Si tu as des tableaux (dynamiques ou non, listes chaînées ou non), ne pas oublier d'écrire leur longueur en premier.

    Edit: Exemple:
    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    typedef struct{
    	int a;
    	char B;
    	float c;
    } Structure_a;
     
    typedef struct {
    	char * d;
    	Structure_a *e;
    	float f;
    	int nba;
    	short g;
    } Structure_b;
     
    void write_Structure_a(Structure_a const *p, FILE* f)
    {
    	fprintf(f, "%d\n", p->a);
    	fprintf(f, "%d\n", p->B);
    	fprintf(f, "%f\n", p->c);
    }
    void read_Structure_a(Structure_a *p, FILE* f)
    {
    	char s[100];
    	int i;
     
    	fgets(s, 100, f);
    	sscanf(s, "%d", &p->a);
     
    	fgets(s, 100, f);
    	sscanf(s, "%d", &i); /*Because C90 has no decimal format for chars*/
    	p->B = i;
     
    	fgets(s, 100, f);
    	sscanf(s, "%f", &p->c);
    }
     
    void write_Structure_b(Structure_b const *p, FILE* f)
    {
    	int ix;
    	fprintf(f, "%d\n", p->d);
    	fprintf(f, "%d\n", p->nba);
    	for(ix=0 ; ix<p->nba ; ix++)
    		write_Structure_a(&p->e[ix], f);
    	fprintf(f, "%f\n", p->f);
    	fprintf(f, "%d\n", p->g);
    }
    void read_Structure_b(Structure_b *p, FILE* f)
    {
    	char s[100];
    	int ix;
     
    	fgets(s, 100, f);
    	sscanf(s, "%d", &p->d);
     
    	fgets(s, 100, f);
    	sscanf(s, "%d", &p->nba);
     
    	p->e = malloc(sizeof(Structure_a) * p->nba); /*pour la gestion d'erreur on verra plus tard*/
    	for(ix=0 ; ix<p->nba ; ix++)
    		read_Structure_a(&p->e[ix], f);
     
    	fgets(s, 100, f);
    	sscanf(s, "%f", &p->f);
     
    	fgets(s, 100, f);
    	sscanf(s, "%hd", &p->g);
    }

  5. #5
    Membre expérimenté

    Homme Profil pro
    Collégien
    Inscrit en
    Juillet 2010
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Juillet 2010
    Messages : 563
    Points : 1 428
    Points
    1 428
    Par défaut
    Salut,

    Je te conseille de décrire ta structure dans un format XML.
    Et pour chaque structure faire 2 fonctions de codage/decodage XML:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char * mystruct_to_xml_string(char *xml_str, size_t n, const mystruct * this);
    mystruct * xml_string_to_mystruct (my_strcut * this, const char *xml_str);

  6. #6
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 196
    Points : 17 165
    Points
    17 165
    Par défaut
    Ce n'est pas forcément une bonne idée. L'XML est assez lourd à produire et surtout à analyser.
    Enfin, tant qu'on veut obtenir un xml bien-formé (je ne parle même pas d'une validation xsd ou DTD)
    Souvent, les formats ini ou json sont de bons choix (ini si pas de profondeur)

  7. #7
    Inactif  


    Homme Profil pro
    Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Inscrit en
    Décembre 2011
    Messages
    9 012
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Doctorant sécurité informatique — Diplômé master Droit/Économie/Gestion
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2011
    Messages : 9 012
    Points : 23 137
    Points
    23 137
    Par défaut
    Après, pour faciliter le chargement de ta structure, je te conseille de mettre un "numéro de version" dans ton fichier.

    Ainsi si tu modifie ta structure, tu incrémentes ton numéro de version et tu seras alors capable de lire d'anciennes sauvegarde.

    Le XML sera très pratique et le numéro de version ne sera pas toujours utile car généralement, il faudra juste mettre des valeurs par défaut avant le chargement du fichier XML et/ou d'ignorer des champs.

    Mais dans le cas de fichiers textes "bruts" ou de fichiers binaires, selon la version, on risque de ne pas du tout lire de la même façon. Dans ce cas là, le numéro de version déterminera la manière de lire le fichier de sauvegarde.

    C'est pour cela que pour des sauvegarde de structures pouvant évoluer, on préfère souvent les fichiers XML ( il existe aussi d'autres types de fichiers du genre -edit : grillé par leternel-).

Discussions similaires

  1. Enregistrer une structure dans un fichier txt
    Par SLF153 dans le forum MATLAB
    Réponses: 4
    Dernier message: 22/03/2011, 14h24
  2. envoyer une structure dans un fichier et le comparer.
    Par gindrou dans le forum Débuter
    Réponses: 3
    Dernier message: 09/12/2008, 19h13
  3. Réponses: 5
    Dernier message: 02/03/2006, 12h04
  4. enregistrer une donnee dans un fichier txt
    Par zorglub88 dans le forum MFC
    Réponses: 33
    Dernier message: 27/01/2006, 16h13
  5. Ecrire le résultat d'une query dans un fichier txt
    Par jbaers dans le forum Bases de données
    Réponses: 2
    Dernier message: 11/11/2005, 02h49

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