Fread & fwrite [Résolu]

Signaler
Messages postés
5
Date d'inscription
mardi 20 mai 2003
Statut
Membre
Dernière intervention
29 novembre 2009
-
Messages postés
5
Date d'inscription
mardi 20 mai 2003
Statut
Membre
Dernière intervention
29 novembre 2009
-
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.

6 réponses

Messages postés
5
Date d'inscription
mardi 20 mai 2003
Statut
Membre
Dernière intervention
29 novembre 2009

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.
Messages postés
1107
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
10 juillet 2018
4
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.
Messages postés
5
Date d'inscription
mardi 20 mai 2003
Statut
Membre
Dernière intervention
29 novembre 2009

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.
Messages postés
5
Date d'inscription
mardi 20 mai 2003
Statut
Membre
Dernière intervention
29 novembre 2009

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..
Messages postés
5
Date d'inscription
mardi 20 mai 2003
Statut
Membre
Dernière intervention
29 novembre 2009

#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..
Messages postés
1107
Date d'inscription
mercredi 15 juin 2011
Statut
Membre
Dernière intervention
10 juillet 2018
4
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.