[C] pourquoi un problème de segmentation du fichier ? je connais ma faute mais c [Résolu]

Signaler
Messages postés
35
Date d'inscription
lundi 13 février 2006
Statut
Membre
Dernière intervention
15 avril 2014
-
Messages postés
35
Date d'inscription
lundi 13 février 2006
Statut
Membre
Dernière intervention
15 avril 2014
-
Bonjour à tous

Mon programma compile très bien, mais à l'execution il me dit que j'ai un problème de Segmentation.

L'objectif du programme est :
- lister tous les fichier d'un répertoire
- afficher à l'écran les fichiers
- effacer les fichiers

Voici le résultat obtenu à l'exécution :

-------------------
On s'occupe du fichier blabla.txt
Erreur de segmentation
---------------------

Merci pour votre aide

#include <stdio.h>
#include <dirent.h>
 
int main(void){
    DIR * rep = opendir("./dirB/");//on spécifie qu'on veut travailler dans le répertoire dirB
    int c;
    FILE * fichier;// il s'aggit du fichier qu'on va manipuler à l'impression
        struct dirent * ent;
    while(1){
        //si le répertoire "dirB" existe
        if (rep != NULL){
            while ((ent = readdir(rep)) != NULL){
            //ON ENTRE DANS LA PARTIE DU FICHIER
                printf("On s'occupe du fichier %s\n", ent->d_name);
                fichier = fopen(ent->d_name, "rb");//on ouvre le fichier en lecture seule
                fseek(fichier, 0L, SEEK_SET);// On se place au début du fichier
                // Tant qu'on ne rencontre pas la fin du fichier, on lit un caractère...
                while ((c = getc(fichier)) != EOF){  // ou encore   while (!feof(fichier))
                    printf("%c", c);// Que l'on affiche à l'écran
                }
                fclose(fichier);//on ferme le fichier
                remove(ent->d_name);//on supprime le fichier
            //ON TERMINER LE MANIPULER LE FICHIER
            //GRACE AU WHILE ON PASSE AU FICHIER SUIVANT                
            }
        
        }
    }
    closedir(rep);
         return 0;
}

2 réponses

Messages postés
1309
Date d'inscription
samedi 31 janvier 2009
Statut
Membre
Dernière intervention
5 juin 2013
13
Salut,

Plusieurs remarques :
 - Je me demande bien a quoi sert ton while(1) a part partir en boucle infinie et ainsi je jamais terminer normalement ton programme.
 - Tu devrais fermer le répertoire uniquement s'il existe et donc a la fin de ton test sur la nullité de rep et non après (en plsu c'est après la boucle infinie donc ça ne sera jamais atteint).
 - L'option b du fopen ne te sert a rien ici et est d'ailleur contradictoire avec ta manière de coder. Utiliser l'option r seule ouvre le fichier en lecture et positionne le pointeur au début de fichier, c'est tout ce dont tu as besoin.
 - Ton fseek ne sert strictement a rien vu qu'on est déjà au début du fichier.
 - Il faut TOUJOURS tester le retour d'un appel systèmes et des fonctions de plus haut niveau les simplifiant.
 - Lire et afficher un fichier caractère par caractère c'est plutôt moche est très long, ça te fait effectuer plein d'appels système (heureusement que le buffer limite la casse). Utilise donc fgets avec un plus gros buffer.

Ton segfault vient du fait que tu n'as pas testé le retour de fopen. En effet, tu aurais du le remarquer au premeir regard, tu essaye d'ouvrir le fichier blabla.txt, sauf qu'il n'existe pas. Et oui, il ne se trouve pas dans le répertoire d'exécution du programme mais dans un sous dossier (celui que tu as ouvert). Tu dois donc concaténer le nom de ton répertoire avec le nom du fichier afin d'obtenir le chemin relatif vers le fichier a manipuler.
Messages postés
35
Date d'inscription
lundi 13 février 2006
Statut
Membre
Dernière intervention
15 avril 2014

parfait, je te remerci pour tes conseils, ca marche super bien