bonjour a tous
voila, j'essaie d'ecrire un programme pour recuperer la racine de cetains fichiers de mon repertoire dans une tableau dynamique en C,
bonjour a tous
voila, j'essaie d'ecrire un programme pour recuperer la racine de cetains fichiers de mon repertoire dans une tableau dynamique en C,
Mon premier poste a ete tronque
Bonjour a tous
Voila, j'essaie d'ecrire un programme pour recuperer la racine de cetains fichier de mon repertoire dans une tableau dynamiaque en C, mais je n'y pas trop
Ca me dit tjrs segmentation fault
voila le code que j'ai écrit, e espérant qu'il y ait quelqu'un qui puisse m'aider la dessus, c'est tres urgent
SVP,quelqu'un pourrait-il m'aider a trouver la solution!!
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66 int main(int argc, char *argv[] ) { char **liste_files; int Nb_files; int i,status; int ld, lw, L; char *racine, *ext; char *extdata=".ima"; char *extweight=".weight.ima"; char *nom; statut=0; struct dirent *lecture; DIR *rep; rep = opendir(argv[1]); Nb_files=0; liste_files=NULL; while ((lecture = readdir(rep))) { L=strlen(lecture->d_name); if(L>lw)//peut etre un fichier weight { ext=str_sub(nom, L-lw,L-1); if(strcmp (extweight, ext)==0)//fichier weight { printf("fichier weight: extension %s, racine: %s\n",ext, str_sub(lecture->d_name, 0,L-lw-1)); } else { ext=str_sub(nom, L-ld, L-1); if(strcmp (extdata, ext)==0)//fichier data { Nb_files++; liste_files = (char**)realloc(liste_files,Nb_files*sizeof(char*)); strcpy(liste_files[Nb_files-1],str_sub(lecture->d_name, 0,L-ld-1)); } } } else {if(L>ld) { ext=str_sub(nom, L-ld, L-1); if(strcmp (extdata, ext)==0)//fichier data { Nb_files++; liste_files = (char**)realloc(liste_files,Nb_files*sizeof(char*)); liste_files[Nb_files-1]=str_sub(nom, 0,L-ld-1); } } } } closedir(rep); printf("nombre de fichier data, d%n", Nb_files); for (ld=0;ld<Nb_files;ld++) printf("nom fichier : %s\n",liste_files[ld]); return status; }
Bonjour,
je regarde pas tant que y a pas la balise code autour
"vaste programme"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 . . .
Salut,
man scandir
Pourquoi les pierres carrées font elles des ronds dans l'eau ?
j'ai verifie mon code sans les troncatures que je deverais faire, et ca marche, le probleme je pense me vient de cette fonction
je n'arrive pas a voir le probleme pour le monmnet sachant que ca marchait bien avant
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 char *str_sub (const char *s, unsigned int start, unsigned int end) { char *new_s = NULL; if (s != NULL && start < end) { new_s = malloc (sizeof (*new_s) * (end - start + 2)); if (new_s != NULL) { int i; for (i = start; i <= end; i++) { new_s[i-start] = s[i]; } new_s[i-start] = '\0'; } else { fprintf (stderr, "Memoire insuffisante\n"); return NULL; } } return new_s; }
si vous pouvez le regarder , peut etre que vous verrez la fautes plutot que moi!!
merci d'avance
n'est jamais vérifiée puisque tu l'initialise à NULL.if (new_s != NULL)
Pourquoi les pierres carrées font elles des ronds dans l'eau ?
Non, ce n'est pas ça j'ai pas fais attention au malloc au dessus
Pourquoi les pierres carrées font elles des ronds dans l'eau ?
new_s est comparee a NULL apres allocation de la memooire, ca reste a null dans le cas ou il n'y a pas assez de memoire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 char *str_sub (const char *s, unsigned int start, unsigned int end) { char *new_s = NULL; ... if (s != NULL && start < end) { new_s = malloc (sizeof (*new_s) * (end - start + 2)); if (new_s != NULL) { .....
sinon ca passe a l'etape de l'extraction
je pense que le probleme n'est pas dans ce bout de code,
Chez moi ta fonction "fonctionne"
voila le résultat:
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 #include <stdlib.h> #include <stdio.h> #include <string.h> char *str_sub (const char *s, unsigned int start, unsigned int end) { char *new_s = NULL; if (s != NULL && start < end) { new_s = malloc (sizeof (*new_s) * (end - start + 2)); if (new_s != NULL) { int i; for (i = start; i <= end; i++) { new_s[i-start] = s[i]; } new_s[i-start] = '\0'; } else { printf ("Memoire insuffisante\n"); return NULL; } } return new_s; } int main(void) { char buf[256]; char* buf2; strcpy(buf, "azertyuiop"); printf("%s\n",buf); buf2=str_sub(buf, 2, 5); printf("%s\n",buf2); return 0; }
[yakamoneye@localhost ~]$ gcc toto.c -o toto
[yakamoneye@localhost ~]$ ./toto
azertyuiop
erty
[yakamoneye@localhost ~]$
Pourquoi les pierres carrées font elles des ronds dans l'eau ?
oui c vrai
je ne vois pas ou est le problème
voila, je veux écrire une fonction qui me renvoie tableau des noms racines des fichiers de mon répertoire ayant que l'extension .ima et non .weight.ima et la, je bidouille la fonction depuis bien longtemps et je n'arrive tjrs pas a trouver la faille,
tt ca juste pour recuperer les noms des images qui m'interessent et non pas le reste
pour pouvoir ecrire reellement ce qui m'est demande a faire!!
alors svp, si vous avez de suggestions, je suis prenante
utilise scandir
extrait du man:
effectue un test
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 #define _SVID_SOURCE /* Afficher le contenu du répertoire en ordre inverse */ #include <dirent.h> int main(void) { struct dirent **namelist; int n; n = scandir(".", &namelist, 0, alphasort); if (n < 0) perror("scandir"); else { while (n--) { printf("%s\n", namelist[n]->d_name); free (namelist [n]); } free (namelist); } }
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 int size; while(n--) { size=strlen(namelist[n]->d_name); if ( (namelist[n]->d_name)[size] == 'a' && (namelist[n]->d_name)[size-1] == 'm' && (namelist[n]->d_name)[size-2] == 'i' ) { /* le fichier porte l'extension ima */ if ( strstr( namelist[n]->d_name, ".weight.ima" ) { /* alors ce champ ne nous interresse pas */ } else { /* tu le stockes */ } } }
Pourquoi les pierres carrées font elles des ronds dans l'eau ?
Ok
Merci pour le tuyau, j'essaie ca et je te donnerai de mes nouvelles,
Merci :-)
c est pas POSIX scandir par contre
"vaste programme"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 . . .
vous pourrez me donner son équivalent posix svp?/
ben cest ca
"vaste programme"
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 . . .
voila, j'ai reussi a regler le probleme, merci beaucoup pour ceux qui m'ont aide
ci-joint le code au cas ou ca pourrait servir un jour
je chercherais apres pour la norme posix,
si vous trouvez avons moi n'hesitez pas a me recontacter svp
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63 int main(int argc, char *argv[] ) { struct dirent **namelist; char **list_files; char *name; int n,i; int ld, lw, L, Nb_files; char *racine, *ext; char *extdata=".ima"; char *extweight=".weight.ima"; n = scandir(argv[1], &namelist, 0, alphasort); printf("nombre de fichiers %d", n); if (n < 0) perror("scandir"); else { Nb_files=(int)(n/2-1); ld=strlen(extdata); lw=strlen(extweight); list_files=(char**)malloc(Nb_files*sizeof(char*)); i=0; while (n-- && i<Nb_files) { name= namelist [n]->d_name; free( namelist [n] ); L=strlen(name); if(L>lw)//peut etre un fichier weight { ext=str_sub(name, L-lw,L-1); if(strcmp (extweight, ext))//fichier weight { ext=str_sub(name, L-ld, L-1); if(strcmp (extdata, ext)==0)//fichier weight { list_files[i]=str_sub(name, 0,L-ld-1); printf("fichier : %s\n",list_files[i]); i++; } } } else { ext=str_sub(name, L-ld, L-1); if(strcmp (extdata, ext)==0)//fichier weight { list_files[i]=str_sub(name, 0,L-ld-1); i++; } } } // free (namelist); } return 0; }
Merci
BainE a raison scandir n'est pas POSIX, mais elle pourrait le devenir... (affaire à suivre )
en attendant, il faut faire une "fonction à la main" en utilisant opendir et readdir qui le sont.
Pourquoi les pierres carrées font elles des ronds dans l'eau ?
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager