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 :

Probleme avec fread ou fwrite.. binaire pas lisible ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 66
    Par défaut Probleme avec fread ou fwrite.. binaire pas lisible ?
    bonjour,
    Pour réviser un peu j'ai voulu me faire un programme très simple utilisant fread et fwrite... pour prendre une structure d'un fichier, la mettre en binaire dans un autre fichier, prendre ce binaire, le mettre en texte dans un fichier et la lire, voici mon code :

    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
     
     
    #include <stdio.h>
    #include <stdlib.h>
    #define MAXN 10
    #define MAXP 10
     
    struct etud_s // la structure d'un étudiant
    {
    	char nom[MAXN];
    	char prenom[MAXP];
    };
     
    struct etud_s tabetud;  //la structure qui me servira pour lire et ecrire
     
    void edition ( struct etud_s tab, char filename[] ) // pour écrire dans tabetud
    {
    	FILE *datei;
    	datei=fopen ( filename,"w" );
     
    	printf ( "\ndonner le nom\n" ); // on met tout simplement ce que l'on veut dans tabetud
    	scanf ( "%s",&tab.nom );
    	fprintf ( datei,"%s\t",tab.nom );
    	printf ( "donner le prenom\n" );
    	scanf ( "%s",&tab.prenom );
    	fprintf ( datei,"%s",tab.prenom ); // sauvegarde dans un fichier.txt OK
    	fclose ( datei );
    }
     
    void speicher ( char output[],char input[] ) // enregistrement en binaire
    {
     
    	FILE *foutput;
    	FILE *finput;
    	foutput=fopen ( output,"wb" ); 
    	finput=fopen ( input,"rb" ); // on prends notre fichier txt
     
    	fwrite ( finput, sizeof ( struct etud_s ),1,foutput ); //on crée le binaire avec simplement ma structure
    }
     
    void lecture ( char input[], char output[],struct etud_s etud ) // pour lire à partir du binaire.. c'est LA que ça foire
    {
    	FILE *finput;
    	FILE *foutput;
    	finput=fopen ( input,"rb" ); // j'ouvre mon binaire et je vais créer un .txt
    	foutput=fopen ( output,"wb" );
    	fread ( finput, sizeof ( struct etud_s ),1,foutput ); //je lis donc depuis mon binaire une structure, et je la met dans un .txt
    	fscanf ( foutput, "%s",&etud.nom ); // pour afficher ensuite le .txt
    	fscanf ( foutput,"%s",&etud.prenom );
    	printf ( "\n le nom est : %s",etud.nom );
    	printf ( "\n leprenom est : %s",etud.prenom );
    }
     
    int main()
    {
    	edition ( tabetud,"edition" ); // edition contient bien ce que j'ai mis dans tabetud
    	speicher ( "speicher","edition" ); //speicher contient "quelque chose" du binaire donc !
    	lecture ( "speicher","lecture",tabetud ); //lecture ne contient rien.. la lecture ne se fait donc pas bien...
     
    	return EXIT_SUCCESS;
    }
    je précise que je n'ai pas fait de teste d'ouverture de fichier pour aller plus vite car je suis certain qu'il n'y a pas de soucis là dessus, j'utilise vraissemblablement mal fread ou fwrite... mais où j'ai remanié tout ça toute la soirée sans trouver mon erreur...

    merci

  2. #2
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    fread permet de lire des données depuis un fichier pour les stocker en mémoire.
    fwrite permet d'écrire des données en mémoire dans un fichier.
    (voir leur man)

    or dans le code, on voit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fwrite ( finput, sizeof ( struct etud_s ),1, foutput ); //on crée le binaire avec simplement ma structure
    /* ... */
    fread ( finput, sizeof ( struct etud_s ),1,foutput ); //je lis donc depuis mon binaire une structure, et je la met dans un .txt
    on donne un fichier comme paramètre là où les fonctions attendent un pointeur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fwrite ( &tabetud, sizeof tabetud, 1, foutput ); 
    /* ... */
    fread ( &tabetud, sizeof tabetud, 1, finput );

    Sinon, lors des appels à scanf le derneir paramètre à l'air louche.

    Citation Envoyé par titimoi Voir le message
    je précise que je n'ai pas fait de teste d'ouverture de fichier pour aller plus vite car je suis certain qu'il n'y a pas de soucis là dessus
    Je ne pense pas comme toi, il ne faut pas avoir peur d'aller un peu moins vite pour faire les choses mieux.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    613
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 613
    Par défaut
    Citation Envoyé par titimoi Voir le message
    je précise que je n'ai pas fait de teste d'ouverture de fichier pour aller plus vite car je suis certain qu'il n'y a pas de soucis là dessus
    Très mauvaise idée. Un jour tu perdra plus de temps a chercher ton erreur qui sera que ton fichier s'est pas ouvert (et il peut y avoir beaucoup de raison pour lesquelles l'ouverture d'un fichier écohue), que le temps gagné a ne pas écrire le test.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 66
    Par défaut
    merci pour les réponses, je m'attendais à ce genre de réponse pour les erreurs, je n'épiloguerais pas dessus.(j'ai rajouté au cas où une erreur.. mais ce n'est pas ça...)

    Concernant le pointeur pour fread et fscan c'est en effet la chose qui me posais problème, le fait est que rien ne change (dans mes problème lorsque je donne une adresse à la place du fichiers lu, si ce n'est que maintenant le fichier speicher ne contient rien... d'où un problème dans fwrite dans la fonction speicher.. voici mon code modifié :

    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
    void speicher ( char output[],struct etud_s tabetud )
    {
     
    	FILE *foutput;
    	foutput=fopen ( output,"wb" );
    if (foutput==0)
    fprintf(stderr,"probleme lors de l'ouverture de %s\n",output);
    else{
    	fwrite ( &tabetud, sizeof ( struct etud_s ),1,foutput );
           }
    }
     
    void lecture ( char input[] /*char output[]*/,struct etud_s tabetud )
    {
    	FILE *finput;
    	finput=fopen ( input,"rb" );
    	fread ( &tabetud, sizeof ( struct etud_s ),1,finput );
    	printf ( "\n le nom est : %s",tabetud.nom );
    	printf ( "\n leprenom est : %s",tabetud.prenom );
    }
     
    int main()
    {
    	edition ( tabetud,"edition" );
    	speicher ( "speicher",tabetud );
    	lecture ( "speicher",tabetud );
     
    	return EXIT_SUCCESS;
    }

  5. #5
    Invité(e)
    Invité(e)
    Par défaut
    Après, il faut aussi vérifier que la variable tabetud est à la fois globale et passée en paramètres à speicher...

    Quand tu donne cette variable en paramètre à édition, elle est passée par copie est rien n'est donc écrit dedans...

    Retire cette variable globale qui ne sert à rien, remplace le prototype de tes fonctions : passe un pointeur plutôt qu'une structure :

    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
    void edition (struct etud_s * tab, char filename[])
    {
        /* à remplir */
    }
    
    void speicher(char output[],  struct etud_s * tab)
    {
        /* à remplir */
    }
    
    void lecture(char input[],  struct etud_s * tab)
    {
        /* à remplir */
    }
    
    int main(void)
    {
        struct etud_s tabetud;
        edition(&tabetud, "edition");
        speicher("speicher", &tabetud);
        lecture("speicher", &tabetud);
    
        return EXIT_SUCCESS;
    }
    merci pour les réponses, je m'attendais à ce genre de réponse pour les erreurs, je n'épiloguerais pas dessus.(j'ai rajouté au cas où une erreur.. mais ce n'est pas ça...)
    Si tu lis bien, tu verras qu'on a pas dit que l'erreur venait de là. On dit juste qu'il n'est jamais trop tôt pour prendre de bonnes habitudes.

    EDIT :
    Dans les prototypes, il faut lire des '*' et pas des '&', qui n'a rien à voir puisse que c'est du c++.
    Dernière modification par Invité(e) ; 16/01/2009 à 10h42. Motif: Les touches & et * se ressemblent vachement

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Août 2008
    Messages
    66
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 66
    Par défaut
    Concernant la variable globale tabetud, il est écris quelque chose dedans puisque je m'en sert dans edition et dans lecture, elle est donc necessaire.

    Si je mets dans les paramètres de mes fonctions des j'ai des erreurs de compilations de type :

    error: expected ')' before '&' token
    que je ne comprend pas, du coup j'ai mis des *tab, et voici mon code avec le rajout de tabfinal:

    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
    #include <stdio.h>
    #include <stdlib.h>
    #define MAXN 10
    #define MAXP 10
     
     
     
    struct etud_s
    {
    	char nom[MAXN];
    	char prenom[MAXP];
    };
     
    struct etud_s tabetud;
    struct etud_s tabfinal;//ici rajout de tabfinal
     
    void edition ( struct etud_s *tab, char filename[] )
    {
    	FILE *datei;
    	datei=fopen ( filename,"w" );
     
    	printf ( "\ndonner le nom\n" );
    	scanf ( "%s",(*tab).nom );
    	fprintf ( datei,"%s\t",(*tab).nom );
    	printf ( "donner le prenom\n" );
    	scanf ( "%s",(*tab).prenom );
    	fprintf ( datei,"%s",(*tab).prenom );
    	fclose ( datei );
    }
     
    void speicher ( char output[],struct etud_s *tab )
    {
     
    	FILE *foutput;
    	foutput=fopen ( output,"wb" );
     
    if (foutput==0)
    fprintf(stderr,"probleme lors de l'ouverture de %s\n",output);
    else
    {
     
    	fwrite ( tab, sizeof ( struct etud_s ),1,foutput );
    }
    }
    void lecture ( char input[] ,struct etud_s *tab )
    {
    	FILE *finput;
    	finput=fopen ( input,"rb" );;
    	fread ( tab, sizeof ( struct etud_s ),1,finput );
    	printf ( "\n le nom est : %s",(*tab).nom );
    	printf ( "\n leprenom est : %s",(*tab).prenom );
    }
     
    int main()
    {
    	edition ( &tabetud,"edition" );
    	speicher ( "speicher",&tabetud );
    	lecture ( "speicher",&tabfinal );
     
    	return EXIT_SUCCESS;
    }

    Comment ça se fait que dans mon fichier speicher, ce ne soit pas du binaire, mais du texte, avec [nom][prenom] d'écris ?? il doit y avoir un soucis de ce côté là

  7. #7
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par titimoi Voir le message
    Si je mets dans les paramètres de mes fonctions des j'ai des erreurs de compilations de type :
    Oui, mea culpa, il fallait lire '*' et pas '&'. (habitude du c++).

    Concernant la variable globale tabetud, il est écris quelque chose dedans puisque je m'en sert dans edition et dans lecture, elle est donc necessaire.
    Pas si tu la déclare dans la fonction main.

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

Discussions similaires

  1. Problèmes avec Fread et Fwrite
    Par Sotoaleono dans le forum C
    Réponses: 1
    Dernier message: 17/02/2015, 10h00
  2. Probleme avec gets - On n'a pas le temps de saisir la chaine
    Par thomas_moore dans le forum Débuter
    Réponses: 3
    Dernier message: 29/10/2010, 13h13
  3. probleme avec fread
    Par supercyprien dans le forum Débuter
    Réponses: 1
    Dernier message: 21/06/2010, 00h30
  4. [PHP-JS] Probleme avec onchange qui ne redirige pas
    Par Greggggggg dans le forum Langage
    Réponses: 11
    Dernier message: 28/07/2006, 12h43
  5. probleme avec fread
    Par booby dans le forum C
    Réponses: 10
    Dernier message: 06/04/2006, 17h21

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