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 :

Erreur de segmentation: Lecture d'un fichier binaire (fonction fread)


Sujet :

C

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 3
    Points : 10
    Points
    10
    Par défaut Erreur de segmentation: Lecture d'un fichier binaire (fonction fread)
    Bonjour/Bonsoir à tous et à toutes,

    si je viens ici c'est pour que vous puissiez éclairer ma lanterne ! Cela fait un peu plus de 4h maintenant que je planche sur le problème et je ne sais plus ou aller pour pouvoir terminer ce projet à bien ! (c'est un projet de gestion de bibliothèque en C)

    Je dois lire un fichier binaire (avec la fonction fread) dont voici le bout de code ci dessous

    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
    int charger_livres(livre_t* livres)
    {
    	int nb_livres=0;
    	flivre = fopen("fichierLivre", "ab+");
    	if((flivre = NULL))
    	{
    	printf("Le fichier n'a pas pu être ouvert");
    	} 
     
    	rewind(flivre);
     
       while(fread(livres, sizeof(livre_t), MAX_LIVRES, flivre) != 0) {
    	nb_livres= fread(livres, sizeof(livre_t), MAX_LIVRES, flivre);
    }
    	return nb_livres;
    }
    int charger_adherents(adherent_t* adherents)
    	{
    	int nb_adhr=0;
    	fadhr = fopen("fichierAdh", "ab+");
    	if((fadhr = NULL))
    	{
    	printf("Le fichier n'a pas pu être ouvert");
    	} 
    	rewind(fadhr);
    	while(fread(adherents, sizeof(adherent_t), MAX_ADHR, fadhr) != 0) {
        nb_adhr= fread(adherents, sizeof(adherent_t), MAX_ADHR, fadhr);
    }
    	return nb_adhr;
    	}
    adherent_t et livres_t sont des structures définies dans mon header dont voici une partie

    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
    #ifndef PRINCIPAL_H
    #define PRINCIPAL_H
     
    #define STR_MAX 50
    #define MAX_ADHR 100
    #define MAX_LIVRES 100
     
     
     
    typedef struct {
      int  adr_cp;
      char adr_ville[STR_MAX];
      char adr_rue[STR_MAX];
    } adresse_t;
     
    typedef struct {
      int       adh_num;
      char      adh_nom[STR_MAX];
      adresse_t adh_adresse;
      int       adh_nb_emprunts;
    } adherent_t;
     
    typedef struct {
      int  liv_num;
      char liv_titre[STR_MAX];
      struct {
        char nom[STR_MAX];
        char prenom[STR_MAX];
      }   liv_auteur;
      int liv_emprunteur;
    } livre_t;
     
     
    FILE *fadhr;
    FILE *flivre;
    Comme vous le voyez les FILE machin sont en globales, donc ils ne précèdent pas les fopen.

    Cependant, lorsque je fais ceci, que je compile, aucune erreur, tout est cool.
    Quand j’exécute, je tombe sur une erreur de segmentation... Et je n'arrive pas du tout à trouver pourquoi.
    J'ai demander de l'aide auprès d'amis mieux qualifié que moi en ce domaine, ils ne savent pas non plus... (et même mon meilleur amis le plus fidèle: google...)
    Je fais appel alors à votre intelligence et à votre expérience afin de soulever une armée pour vaincre ces erreurs de segmentation qui nous pourrissent la vie !

    En vous remerciant par avance de votre aide,

    Ascheritt, codeur en bouse.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Salut

    Concernant les deux fonctions :

    L'opérateur de comparaison est == et non =. Ici tu donnes la valeur NULL au pointeur, au lieu de le comparer. Du coup, ça va crasher plus loin...
    En outre, même en utilisant le bon opérateur, si le pointeur vaut effectivement NULL (erreur d'ouverture du fichier), le programme poursuit quand même son exécution... et va crasher plus loin.

    Le compilateur doit normalement t'afficher un avertissement, s'il est bien réglé. Ta condition "if" n'est pas une erreur à proprement parler, mais ce genre de condition doit être considérée comme très suspecte par le compilo, qui doit te le faire savoir.

    Par contre, je ne comprends pas tes deux boucles. A chaque tour de boucle, tu lances deux fois "fread", et tu stockes dans "nb_livres" (ou "nb_adhr") la valeur retournée du second "fread".
    Ce qui fait qu'au final, tes variables auront pour valeur 0 : soit la variable initialisée à 0 n'a pas bougé, soit il y a sortie de boucle après y être entré au moins une fois, après une fin de fichier (car il n'y a plus aucun élément à lire) ou une erreur de lecture, et la valeur finale de "nb_livres" (ou de "nb_adhr") sera de... 0.

    Que veux-tu faire exactement ? Je ne comprends pas ta démarche.

    Pour finir, les variables globales ne sont pas du tout justifiées.

  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 680
    Points
    13 680
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jeroman Voir le message
    L'opérateur de comparaison est == et non =. Ici tu donnes la valeur NULL au pointeur, au lieu de le comparer. Du coup, ça va crasher plus loin...
    Petit conseil : toujours écrire les tests d'égalité dans l'autre sens, cad CONSTANTE == VARIABLE, donc dans ton cas if( NULL == flivre ). Tu es sûr alors de ne pas faire affecter par erreur la constante à ta variable. En effet, ce code ne compilera pas.

    Comme l'a dit jeroman, vérifie également que tous les warnings de ton compilateur sont activés.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 3
    Points : 10
    Points
    10
    Par défaut
    Tout d'abord merci de vos réponses rapides !

    concernant les deux boucles, heu en faite elles n'ont rien à faire là, je les ai rajouté car un gars faisait ça quand j'ai fais des recherches sur google, et dans un saut de désespoir, je les ai mise, ne sait-on jamais ! en vain.
    Voila, c'est plutot ça du coup, désolé de l'erreur...

    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
    int charger_livres(livre_t* livres)
    {
    	int nb_livres=0;
    	flivre = fopen("fichierLivre", "ab+");
    	if((flivre == NULL))
    	{
    	printf("Le fichier n'a pas pu être ouvert");
    	} 
     
    	rewind(flivre);
     
     
    	nb_livres= fread(livres, sizeof(livre_t), MAX_LIVRES, flivre);
     
    	return nb_livres;
    }
    int charger_adherents(adherent_t* adherents)
    	{
    	int nb_adhr=0;
    	fadhr = fopen("fichierAdh", "ab+");
    	if((fadhr == NULL))
    	{
    	printf("Le fichier n'a pas pu être ouvert");
    	} 
    	rewind(fadhr);
     
        nb_adhr= fread(adherents, sizeof(adherent_t), MAX_ADHR, fadhr);
     
    	return nb_adhr;
    	}
    Voila plutot.
    En gros je veux lire le fichier et le mettre dans le tableau.

    Dans un bout de mon main lorsque j’appelle la fonction charger_adherent ca se passe comme ceci

    nb_adhr = charger_adherent(adherents);

    Évidemment, même formulation pour les bouquins.

    Ensuite pour ce qui est du compilateur, je n'ai aucune idée de comment le réglé ou autre chose, j'utilise Geany comme logiciel et il compile tout seul comme un grand...(enfin pour tout vous avouer, même si je compile dans le terminal, je n'ai aucune idée de comment le régler !)

    Merci de l'astuce Bktero, je m'en servirais !

    Je précise aussi que mes deux fichiers sont vide. (Erreur de segmentation, c'est quand on "sort du tableau" je crois, et remplir un tableau d'un fichier vide, si ça débordait... ça se saurais !)
    Je file changer l'opérateur !

    EDIT: Bah... je me sens super bête du coup, mais c'était bien l'opérateur dans le if qui faisait crasher...
    Je vous remercie tout les deux encore une fois, vous m'avez sortit une belle épine du pied ! Passez une agréable journée, et bonne année !
    J'ai mis le code fonctionnel ci dessus, si jamais un bêtinet comme moi plante sur ça

  5. #5
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 680
    Points
    13 680
    Billets dans le blog
    1
    Par défaut
    Appuie sur le bouton "Résolu" en bas de la page si tout est OK

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Points : 1 750
    Points
    1 750
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if((flivre == NULL))
    	{
    	printf("Le fichier n'a pas pu être ouvert");
    	}
    Par contre, il y a toujours un crash potentiel, comme je le précisais plus haut. Si le pointeur est à NULL, le programme se poursuit quand même...

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2011
    Messages : 3
    Points : 10
    Points
    10
    Par défaut
    Oui j'ai vu je te remercie je suis en train de corriger ça.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 25/05/2011, 15h38
  2. Réponses: 15
    Dernier message: 31/03/2007, 16h32
  3. lecture d'un fichier binaire en VB
    Par olivier] dans le forum VB 6 et antérieur
    Réponses: 7
    Dernier message: 28/12/2005, 11h17
  4. Lecture d'un fichier binaire
    Par Gloubie dans le forum Langage
    Réponses: 9
    Dernier message: 05/12/2005, 12h51
  5. Erreur à la lecture d'un fichier
    Par sebduth dans le forum Fortran
    Réponses: 3
    Dernier message: 26/08/2005, 16h30

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