Fread & fwrite [Résolu]

Messages postés
5
Date d'inscription
mardi 20 mai 2003
Statut
Membre
Dernière intervention
29 novembre 2009
- - Dernière réponse : mosted
Messages postés
5
Date d'inscription
mardi 20 mai 2003
Statut
Membre
Dernière intervention
29 novembre 2009
- 29 nov. 2009 à 13:12
Bonjour,

Etant débutant , j'ai un soucis avec un code à faire pour l'école.
Nous devons lire des structures d'un fichier binaire.

Voici mon code
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
int main(int argc, char * argv[]) {

//déclaration
typedef struct Reservation {
char * nom;
char * prenom;
char * adresse;
int repasAdultes;
int repasEnfants;	
} Reservation;
char * buffer;
FILE * f_in = NULL;	
long lSize;	
size_t result;
Reservation laReservation;

//switch
switch (argc) {	

case 1 :
fprintf(stderr,"Paramètres manquants\n");
exit(1);	
case 2 :
printf("Ouverture du fichier reservation.txt\n");
f_in = freopen(argv[1],"rb",stdin);
break;
default :
fprintf(stderr,"Trop de paramètre");
exit(1); 
}

//si f_in est pas ouvert
if(f_in == NULL) {
fprintf(stderr,"Erreur d'ouverture des fichiers\n");
exit(1);
}

/*optain file size*/
fseek(f_in, 0, SEEK_END);
lSize= ftell(f_in);
rewind (f_in);

/*allocate memory to contain whole file : */
buffer = (char *) malloc(sizeof(char)*lSize);
if (buffer == NULL) { fprintf(stderr,"Erreur d'allocation mémoire\n"); exit(1); }

//copy file in the buffer
result = fread(buffer,1,lSize,f_in);

if(result != lSize) {fprintf(stderr,"Erreur de lecture\n"); exit(1); }
//file is in the buffer

while(fgets(laReservation,255,stdin) != NULL) {

/*recup données strtok*/

printf("Nom : %s\n",laReservation.nom);
printf("Prénom : %s\n",laReservation.prenom);
printf("Adresse : %s\n",laReservation.adresse);
printf("Repas adultes: %s\n",laReservation.repasAdultes);
printf("Repas enfants: %s\n",laReservation.repasEnfants);	

}


fclose(f_in);
free(buffer);
return 0;
}


J'aimerais lire un enregistrement un par un.
Comment faire pour vérifier la fin du fichier et avancer dans les lignes.
Afficher la suite 

6 réponses

Meilleure réponse
Messages postés
5
Date d'inscription
mardi 20 mai 2003
Statut
Membre
Dernière intervention
29 novembre 2009
3
Merci
Ouep c'est bon j'ai corriger.

Le prof nous a expliquer que les char* c'est mauvais pour les enregistrements binaires.

Il faut utiliser des char nom[20]; ect..

Sinon pas possible de lire les structures.

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 196 internautes nous ont dit merci ce mois-ci

Commenter la réponse de mosted
Messages postés
1108
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
10 juillet 2018
4
0
Merci
grosso modo c'est :
   while (!feof(f_in) || result > 0) {
      result = fread(buffer,sizeof(Reservation),1,f_in);
  }


De souvenir, il me semble que fread fait avancer le pointeur de lecture dans le fichier.
Commenter la réponse de fregolo52
Messages postés
5
Date d'inscription
mardi 20 mai 2003
Statut
Membre
Dernière intervention
29 novembre 2009
0
Merci
Merci pour ta réponse,

J'ai modifier un peu et voici la solutions qui fonctionne chez moi :

while (!feof(f_in) || result > 0) {
      result = fread(&laReservation,1,sizeof(Reservation),f_in);
  }


J'ai tester ça à l'air de fonctionner.
Commenter la réponse de mosted
Messages postés
5
Date d'inscription
mardi 20 mai 2003
Statut
Membre
Dernière intervention
29 novembre 2009
0
Merci
Voila mon code :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
int main(int argc, char * argv[]) {

    //déclaration
    typedef struct Reservation {
        char * nom;
        char * prenom;
        char * adresse;
        int repasAdultes;
        int repasEnfants;
    } Reservation;

    FILE * f_in = NULL;
    size_t result;
    Reservation laReservation;

    //switch
    switch (argc) {
        case 1 :
            fprintf(stderr,"Paramètres manquants\n");
            exit(1);
        case 2 :
            printf("Ouverture du fichier %s\n",argv[1]);
            f_in = fopen(argv[1],"r");
            break;
        default :
            fprintf(stderr,"Trop de paramètre");
            exit(1);
    }
    printf("1..ok\n");

    //si f_in est pas ouvert
    if(f_in == NULL) {
        fprintf(stderr,"Erreur d'ouverture des fichiers\n");
        exit(1);
    }
printf("2..ok\n");

    while (!feof(f_in) || result > 0) {
        result = fread(&laReservation,sizeof(Reservation),1,f_in);
        /*printf("Nom : %s\n",laReservation.nom);
        printf("Prénom : %s\n",laReservation.prenom);
        printf("Adresse : %s\n",laReservation.adresse);
        printf("Repas adultes: %i\n",laReservation.repasAdultes);
        printf("Repas enfants: %i\n",laReservation.repasEnfants);*/

    }
 printf("3..ok\n");
    /*	while(fgets(laReservation,255,stdin) != NULL) {


    printf("Nom : %s\n",laReservation.nom);
    printf("Prénom : %s\n",laReservation.prenom);
    printf("Adresse : %s\n",laReservation.adresse);
    printf("Repas adultes: %s\n",laReservation.repasAdultes);
    printf("Repas enfants: %s\n",laReservation.repasEnfants);

    }

    */
    fclose(f_in);
    printf("4..ok\n");
    return 0;
}





Mais ça me fait une jolie segmentation fault au niveau du while..
Commenter la réponse de mosted
Messages postés
5
Date d'inscription
mardi 20 mai 2003
Statut
Membre
Dernière intervention
29 novembre 2009
0
Merci
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
int main(int argc, char * argv[]) {

    //déclaration
    typedef struct Reservation {
        char * nom;
        char * prenom;
        char * adresse;
        int repasAdultes;
        int repasEnfants;
    } Reservation;

    FILE * f_in = NULL;
    size_t result;
    Reservation laReservation;

    //switch
    switch (argc) {
        case 1 :
            fprintf(stderr,"Paramètres manquants\n");
            exit(1);
        case 2 :
            printf("Ouverture du fichier %s\n",argv[1]);
            f_in = fopen(argv[1],"r");
            break;
        default :
            fprintf(stderr,"Trop de paramètre");
            exit(1);
    }
    printf("1..ok\n");

    //si f_in est pas ouvert
    if(f_in == NULL) {
        fprintf(stderr,"Erreur d'ouverture des fichiers\n");
        exit(1);
    }
printf("2..ok\n");
  int i=0;
//result = fread(&laReservation,sizeof(Reservation),1,f_in);
    while (!feof(f_in) || result > 0) {
        result = fread(&laReservation,sizeof(Reservation),1,f_in);
        //printf("Nom : %s\n",laReservation.nom);
        /*
        printf("Prénom : %s\n",laReservation.prenom);
        printf("Adresse : %s\n",laReservation.adresse);
        printf("Repas adultes: %i\n",laReservation.repasAdultes);
        printf("Repas enfants: %i\n",laReservation.repasEnfants);*/

        printf("lecture %d\n",result);
        i++;

    }
    printf("3..ok\n");
    fclose(f_in);
    printf("4..ok\n");
    return 0;
}


Maintenant ça lit bien , mais je ne sais pas extraire les données Nom prénom ect..
Commenter la réponse de mosted
Messages postés
1108
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
10 juillet 2018
4
0
Merci
oula !! en me relisant j'ai fait une connerie !!
c'est plutot 1 & dans le while :
size_t result=1;
while (!feof(f_in) && result > 0) {
...


Autre chose, comment ta structure est sauvegardée dans le fichier ?
Les char * c'est pas top du tout !! Il faut préférer un char [32] par ex.
Commenter la réponse de fregolo52