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 avec fclose


Sujet :

C

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 12
    Par défaut Erreur de segmentation avec fclose
    Bonjour à tous,

    Je réalise un programme en C qui nécessite de lire et d'écrire dans des fichiers. Une des fonctions me pose un gros problème car elle est, à l'exécution à l'origine d'une erreur de segmentation. Voici cette fonction:


    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
     
    void RegularExpressionsSearch ()
    ,{
    	FILE *pointeur3;
      	FILE *pointeur5;
     
            pointeur3 = fopen ("b.txt", "r"); 
    	pointeur5 = fopen ("Intermediaire2.txt", "w");
     
            char SpecialCharacter1 = 'D';
            char SpecialCharacter2 = 'p';
     
            char *tab1 = (char *)malloc(10000*sizeof(char));
     
    	//Tant  que le premier caractère de la ligne est différent de D (cette boucle enregistre dans tab1 toutes les lignes situées avant la phrase commençant par D)
            while ((getc(pointeur3)) != SpecialCharacter1)
    	{
    		fgets (tab1, 100, pointeur3);
    	}
     
            while (fgets(tab1, 100, pointeur3) != NULL)
    	{
    		fprintf (pointeur5, "%s", tab1);
    	}
     
    	fclose (pointeur3);
    	fclose (pointeur5);
     
    	FILE *pointeur6;
      	FILE *pointeur7; 
     
      	pointeur6 = fopen ("Intermediaire2.txt", "r");
            pointeur7 = fopen ("Intermediaire3.txt", "w");
     
     
    	while (fgets(tab1, 150, pointeur6) !=NULL)
            {
                    if (tab1[0] == SpecialCharacter2)
    		{
                                fprintf (pointeur7, "%s", tab1);
     
                   }
    	}
            fclose (pointeur6);
    	fclose (pointeur7);
    return;
    }

    J'ai fait plusieurs tests et je me suis rendu compte que quand je ne fermais pas le pointeur 7 il n'y avait plus d'ereur de segmentation (mais çà ne résoud pas mon problème pour autant car si je ne ferme pas ce pointeur il est alors impossible de réutiliser le fichier vers lequel il pointe, ie Intermediaire3.txt, dans la suite du programme.

    De même, si je met la boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    while (fgets(tab1, 150, pointeur6) !=NULL)
            {
                    if (tab1[0] == SpecialCharacter2)
    		{
                                fprintf (pointeur7, "%s", tab1);
     
                   }
    	}
    en commentaire alors il n'y a plus d'erreur de segmentation.

    Voilà, au vu de ce code et de l'exposition de mon problème pouvez-vous me dire d'où vient le souci ??

    Je vous remercie par avance pour toute aide (car ça fait maintenant 2 jours que je bloque complètement sur çà).

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Commence par vérifier les valeurs de retour de tes appels à fopen() et malloc().

    free(NULL) est garanti ne rien faire, mais fclose(NULL) est un comportement indéfini...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 12
    Par défaut
    Ok je vais essayer. Peux-tu me dire comment faire pour vérifier ces valeurs de retours? Merci

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 12
    Par défaut
    J'ai rajouté cette ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (pointeur7!=NULL)
    		printf ("COUCOU");
    COUCOU s'affiche bien sur le shell

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 12
    Par défaut
    Je me suis mal expliqué : le test que j'ai fait marche quand je met en commentaire la boucle qui pose problème (àa semble évident).

    Mais je n'ai aucun moyen de tester le retour de fopen juste avant de faire le fclose car l'erreur de segmenatation stoppe l'exécution de mon programme

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par sylvanus35 Voir le message
    Je me suis mal expliqué : le test que j'ai fait marche quand je met en commentaire la boucle qui pose problème (àa semble évident).

    Mais je n'ai aucun moyen de tester le retour de fopen juste avant de faire le fclose car l'erreur de segmenatation stoppe l'exécution de mon programme
    La forme canonique pour gérer un fichier est ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    FILE *fp = fopen("fichier", "r");
    if (fp != NULL)
    {
       /* utilisation */
     
       fclose (fp), fp = NULL;
    }
    Elle garantit un fonctionnement sans erreur. Si il y a 2 fichier, un en lecture, un en écriture, par exemple, il suffit d'imbriquer une copie de cette forme dans celle-ci en renommant les variables correctement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    FILE *fp_src = fopen("source", "r");
    if (fp_src != NULL)
    {
       FILE *fp_des = fopen("destination", "w");
       if (fp_des != NULL)
       {
          /* utilisation */
     
          fclose (fp_des), fp_des = NULL;
       }
     
       fclose (fp_src), fp_src = NULL;
    }

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 188
    Par défaut
    Ta essayé d'utiliser un debugger style Valgrind ou gdb pour localisé vraiment le problème ? ton fichier est bien encodé .

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Septembre 2006
    Messages : 102
    Par défaut
    Citation Envoyé par sylvanus35 Voir le message
    J'ai rajouté cette ligne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (pointeur7!=NULL)
    		printf ("COUCOU");
    COUCOU s'affiche bien sur le shell
    Il n'y a pas que pointeur7 à contrôler. Si pointeur3 ou pointeur6 sont nul, la fct getc/fgets va segfaulter.

    Hum, essaie ça, tu vas comprendre ce qui va pas:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
            while ((a = getc(pointeur3)) != SpecialCharacter1) {
    	  printf("a: %#x\n", a);
    	  fgets(tab1, 2, pointeur3);
    	  printf("a: %#x\n", a);
    }
    On print le code hex, parce que tu peux avoir des surprises. Essaie de prendre un fichier avec des lettres différentes .

    +

Discussions similaires

  1. erreur de segmentation avec pyopengl et glut
    Par bourriquet_42 dans le forum OpenGL
    Réponses: 3
    Dernier message: 01/03/2009, 13h35
  2. Erreur de segmentation avec delete
    Par ValyGator dans le forum C++
    Réponses: 13
    Dernier message: 11/02/2009, 20h44
  3. Erreur de segmentation avec libxml2
    Par DevMg dans le forum XML
    Réponses: 0
    Dernier message: 18/02/2008, 14h44
  4. Erreur de segmentation avec RSA_verify
    Par LorDjidane dans le forum C
    Réponses: 7
    Dernier message: 14/06/2007, 11h29
  5. Erreur de segmentation avec un main vide
    Par matique dans le forum Réseau
    Réponses: 10
    Dernier message: 22/04/2007, 07h07

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