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
22 janvier 2010 à 23:27:24

j'ai un problème pour concaténer les 2 variables (fichier et rep), elles ne sont pas du meme type.

godrik
godrik
Niveau 30
22 janvier 2010 à 23:56:52

unlink fonctionne avec des chemins relatifs. Voici un exemple:

erik@eriklaptop:tmp$ touch test
erik@eriklaptop:tmp$ cat unlink_test.c

  1. include <unistd.h>

int main ()
{
unlink ("test");
return 0;
}
erik@eriklaptop:tmp$ cc unlink_test.c -o unlink_test
erik@eriklaptop:tmp$ ./unlink_test
erik@eriklaptop:tmp$ ls test
ls: cannot access test: No such file or directory
erik@eriklaptop:tmp$

Le probleme de OP vient du fait qu'il faut ajouter le nom du repertoire devant le nom du fichier puisqu'il ne lit pas le repertoire courant.

Tu cherches a concatener des chaines de caracteres. "man 3 strcpy" repondra a ta question. Je te conseille quand meme de lire un livre ou un cours de C car tu sembles manquer de base sur la memoire, les tableaux et les pointeurs.

chris_27
chris_27
Niveau 10
23 janvier 2010 à 01:58:15

Je dirais même mieux :

$ man 3 strncat

Epoch
Epoch
Niveau 10
23 janvier 2010 à 11:27:05

yannick=>C'est la syntaxe qui se trouve dans mes cours de C, donc évidemment que j'en suis sûr ;)

yannick0011
yannick0011
Niveau 7
24 janvier 2010 à 19:10:54

Epoch, pour moi ca ne marchait pas parce que mon type était struct dirent...

Au niveau de la concaténation, j'avais aussi une erreur pour les types de variable à concaténer qui n'étaient pas du même type (rep type DIR et fichier type dirent)

Pour y remédier, j'ai ajouté une variable qui contient le chemin

puis j'ai copié puis concaténé le tout dans une autre variable comme on me l'as sugéré (strcpy et strcat)

et j'ai rajouté une allocation de mémoire identique a celle de Epoch

Maintenant, tout marche ^^, mais faut que je rajoute des petit truc... le fait qu'il supprime le répertoire une fois qu'il n'y a plus de fichier (ca doit etre facile à faire)et une option de récurssivité.

Je vous mets le code qui marche tout en vous remerciant ^^:
Pour l'option de suppression du répertoire et la réccusivité je vais le mettre quand j'aurai réussi.

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

char *chemin_rep="/home/a/b/";
int fd;
char errsv;
char *buffer;

int main(){

DIR *rep;
rep=opendir(chemin_rep);

struct dirent *fichier=NULL;

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

while(fichier=readdir(rep)){
if((fichier->d_name[0]!='.')){

strcpy(buffer, chemin_rep);
strcat(buffer, fichier->d_name);
printf("%s",buffer);

if(fd=unlink(buffer)==-1){
printf("%s",buffer);
int errsv = errno;
if (errsv == EACCES){
printf("\nacces ecriture au dossier non autorise");
}
if (errsv == EBUSY){
printf("\nfichier ne peut pas etre detruit par unlink car utilise par le systeme ou par processus");
}
if (errsv == EISDIR){
printf("\nceci est un repertoire");
}
if (errsv == EPERM){
printf("\nnecessite un priviliège");
}
if (errsv == EROFS){
printf("\nfichier en lecture seule");
}

printf("erreur unlink");
}
if(fd=unlink(buffer)==0){
printf("ok");
}
}
}
free(fichier);
closedir(rep);
return (0);
}

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