CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C]problème erreur de segmentation

yannick0011
yannick0011
Niveau 7
20 janvier 2010 à 23:17:23

Bonjour tout le monde,

Voila je suis en train de faire un programme qui dois ouvrir un dossier et supprimé tout les fichier contenu dans se dossier.

Lorsque je compile mon code tout est ok, mais lorsque je l'exécute j'ai une erreur de segmentation et je ne comprends pas ou est ma faute.

Est ce que vous pouvez m'aider a comprendre et à résoudre le problème ?

merci d'avance.

voici le code:

  1. include <sys/types.h>
  2. include <dirent.h>
  3. include <unistd.h>
  4. include <stdio.h>

char *filepath;
char *reppath;
char *suppr;
char delete;
char rep_chemin;

int main(){
rep_path=&rep_chemin;

printf("saisir le chemin du repertoire\n");
scanf("%s",&rep_chemin);

DIR *rep;
rep=opendir(rep_path);

struct dirent *fichier;
while(fichier=readdir(rep)){
if(fichier->d_name[0]!='.'){
unlink(fichier->d_name);
}
}
closedir(rep);
return (0);
}

Epoch
Epoch
Niveau 10
20 janvier 2010 à 23:19:30

Là, ça vient de me sauter aux yeux.

Aucune allocation dynamique...

De plus, tu tentes de saisir une chaine alors que le char n'est pas un pointeur.

Epoch
Epoch
Niveau 10
20 janvier 2010 à 23:20:28

printf("saisir le chemin du repertoire\n");
scanf("%s",&rep_chemin);

pour le scanf, tu fais ça

scanf("%s", rep_chemin);

char rep_chemin;

A remplacer par

char* rep_chemin;

chris_27
chris_27
Niveau 10
20 janvier 2010 à 23:31:40

À noter que dans ces cas là, l'utilisation d'un débogueur est plus que conseillée.

Vu que tu parles bien d' "erreur de segmentation", tu es sous linux (ou mac OS) ? Si oui, tu as ddd qui est très pratique. Sur cet exemple, il te dit direct à quelle ligne tu as eu l'erreur (et bien d'autres choses).

godrik
godrik
Niveau 30
21 janvier 2010 à 00:04:47

en plus de gdb ou ddd ou quoi que ce soit, si on est sur un processeur x86 ou x86_64, on peut utiliser valgrind pour detecter les lectures/ecritures bizarre en memoire et les fuites de memoires.

"man 1 valgrind" pour plus de renseignement.

yannick0011
yannick0011
Niveau 7
21 janvier 2010 à 23:41:21

étant débutant, j'ai chercher juste après avoir poster le message un tuto de debugage et apperement la ligne qui pose problème c'est celle qui contient le readdir.

sinon je vais essayer en mettant une allocation dynamique et en modifiant le &rep_chemin

yannick0011
yannick0011
Niveau 7
22 janvier 2010 à 00:00:50

Il y a un truc que je comprends pas très bien, hier ca ne marchais pas "erreur de segmentation". là, j'ai repris le code sauf que j'ai rajouté un "_" à la variable char* reppath (j'ai oublié de mettre un underscor en collant le code)en lançant un debugage (gdb) (je suis sous fedora).
Le code s'est lancé correctement sans erreur.

Je relance le code normalement, le code se termine bien mais il n'a rien supprimé comme fichier dans mon répertoire.

godrik
godrik
Niveau 30
22 janvier 2010 à 00:08:16

ce genre de chose depend fortement de comment se passe la compilation. En tout cas le code est faux dans le sens outu ecris n'importe ou en memoire. Il est IMPERATIF d'allouer proprement la memoire pour la chaine de caractere qui contient le nom du fichier a supprimer.

yannick0011
yannick0011
Niveau 7
22 janvier 2010 à 01:34:47

Alors voila, j'ai modifié le code.

J'ai utilisé malloc pour l'allocation de la memoire(je ne sais pas si je l'ai bien employé...), free pour la liberation de la memoire.

J'ai supprimé la saisie du répertoire.

J'ai ajouté une ligne qui m'affiche les fichiers contenus dans le répertoire

Lors de la compilation rien à signaler
Lors de l'exécution le programme m'indique bien le contenu du répertoire mais ne supprime pas les fichiers.

voici le code:

  1. include <sys/types.h>
  2. include <dirent.h>
  3. include <unistd.h>
  4. include <stdio.h>
  5. include <stdlib.h>

char *filepath;
char *reppath;
char *suppr;
char delete;

int main(){

DIR *rep;
rep=opendir("b");

struct dirent *fichier=NULL;
fichier=malloc(sizeof(char));

while(fichier=readdir(rep)){
printf("%s\n",fichier->d_name);
if(fichier->d_name[0]!='.'){
unlink(fichier->d_name);
}
}
free(fichier);
closedir(rep);
return (0);
}

godrik
godrik
Niveau 30
22 janvier 2010 à 01:59:49

mmm, your allocation is wrong.
you are only allocating sizeof(char) bytes but you want to are allocation a struct dirent.

fichier=malloc(sizeof(struct dirent));
is the line you are looking for.

yannick0011
yannick0011
Niveau 7
22 janvier 2010 à 02:59:20

Merci pour ton aide, j'avais mis char parce que les noms récupérer sont des chaines de caractère mais j'ai compris mon erreur (ca s'appuie sur le type de la variable si j'ai bien compris)

Mais pour le fait que ca ne supprime pas les fichiers du dossier je n'arrive pas du tout à comprendre. Pourtant fichier->d_name récupère bien les fichiers contenu dans le dossier.

godrik
godrik
Niveau 30
22 janvier 2010 à 03:32:25

tu devrais tester la code de retour en unlink ainsi que errno.

Epoch
Epoch
Niveau 10
22 janvier 2010 à 20:32:12

fichier=(char*)malloc(sizeof(char));

Syntaxe exacte...

yannick0011
yannick0011
Niveau 7
22 janvier 2010 à 20:57:54

Epoch t'es sur que c'est fichier=(char*)malloc(sizeof(char)) qui faut mettre ?

Parce que quand je mets ça j'ai une erreur de type sur le pointeur à la ligne ou je viens de le mettre...

Je remets l'ancienne solution et je vais regarder du coté de errno

Par contre je vois pas de quoi tu veux parler godrik en parlant du code de retour en unlink? tu veux dire si unlink me retourne -1 ou 0??

yannick0011
yannick0011
Niveau 7
22 janvier 2010 à 21:27:23

bon j'ai ajouté le code pour savoir si le unlink me retourne -1 ou 0
==> unlink me retourne -1

j'ai fait de meme pour errno
==> errno me retourne ENOENT

godrik
godrik
Niveau 30
22 janvier 2010 à 21:34:03

man 2 unlink:

ENOENT A component in pathname does not exist or is a dangling symbolic link, or pathname is
empty.

Je me demande si unlink n'attend pas un chemin complet... (ca serait assez con mais bon)

yannick0011
yannick0011
Niveau 7
22 janvier 2010 à 21:53:01

admettons que unlink doit prendre un chemin complet
comment je pourrai faire par exemple:

suppr=rep/fichier;

???

godrik
godrik
Niveau 30
22 janvier 2010 à 22:05:45

pas compris.

dnob700
dnob700
Niveau 10
22 janvier 2010 à 22:18:23

si unlink attend effectivement un chemin absolu mais que tu veux lui passer un chemin relatif, commence par récupérer le chemin courant avec getcwd, puis concatène le à ton chemin rekatif. Pense aussi à supprimer les morceau du genre ".." dans ton chemin relatif (il y a une fonction pour ça, mais je ne sais plus laquelle).

yannick0011
yannick0011
Niveau 7
22 janvier 2010 à 22:24:04

Comme ma variable rep récupére le nom du répertoire et que fichier->d_name récupére le nom des fichier

Pour moi il faudrait que je mette dans une autre variable par exemple suppr le chemin rep/fichier->d_name

Comme ca, si le répertoire b contient les fichiers test et le fichier test2 la variable suppr prendrai pour valeur b/test puis b/test2

Du coup pour le unlink aura un chemin complet.

Mais le problème c'est que faire suppr=rep/fichier ne marche pas ca me fait une erreur

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Internet
  • Macintosh
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware