c'est deux elements de la tructure data:
c'est deux elements de la tructure data:
Ok, alors maintenant, tu peux écrire le code...Envoyé par melmouj
(merci d'utiliser le bouton [Citer])
Bonjour,
voila j'ai fait ça
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 int compar_size(const void * pt_a, const void * pt_b) { const struct data * pt_da=pt_a; const struct data * pt_db=pt_b; return pt_da->sbuf.st_size - pt_db->sbuf.st_size; }
mais n'affiche pas la meme chose que dir (ls sous unix)
Correct, mais il faut aussi voir l'appel de qsort().Envoyé par melmouj
"Pas la même chose", c'est vachement clair... on est censé deviner ?mais n'affiche pas la meme chose que dir (ls sous unix)
ce que je veux dire que les fichiers ne correspondaient aux taillesEnvoyé par Emmanuel Delahaye
çàd la taille d'un fichier x correspond à un fichier y.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 if(!err) { qsort(p_data, nbr, sizeof *p_data, compar_size); for(...) .............
Il faudrait voir l'ensemble du code...Envoyé par melmouj
voila le code :
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
67
68
69
70
71
72
73
74
75 #include <sys/types.h> #include <sys/stat.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> #include <unistd.h> #include <strings.h> #define FMT_TIME "%Y%m%d-%T" #define Max 1000 struct data { struct stat sbuf; char *file_name; }; int compar_size(const void * pt_a, const void * pt_b) { const struct data * pt_da=pt_a; const struct data * pt_db=pt_b; return pt_da->sbuf.st_size - pt_db->sbuf.st_size; } int main (int argc, char *argv[]) { int i, mode; int nbr=argc - 1; char * patch=NULL; char date1[Max]; char date2[Max]; char date3[Max]; struct data *p_data = malloc (nbr * sizeof * p_data); if (p_data != NULL) { int result=0; for(i=0; !result && i < nbr; i++) { result=stat(argv[i+1], &p_data[i].sbuf); p_data[i].file_name = argv[i + 1]; } if(!result) { qsort(p_data, nbr, sizeof *p_data, compar_size); for(i=0; i <nbr; i++) { mode=p_data[i].sbuf.st_mode; patch=argv[i]; strftime (date1,sizeof date1,FMT_TIME, gmtime (&p_data[i].sbuf.st_mtime)); strftime (date2,sizeof date2,FMT_TIME, gmtime (&p_data[i].sbuf.st_atime)); strftime (date3,sizeof date3,FMT_TIME, gmtime (&p_data[i].sbuf.st_ctime)); if(S_ISDIR (mode)) { printf ("%10lu %20s %s %s %s\n",(unsigned long)p_data[i].sbuf.st_size, date1,date2, date3, patch); } //if(S_ISLNK(mode)) printf("%s S File size %ld\n", argv[i], if(S_ISREG (mode)) { printf ("%10lu %20s %s %s %s\n",(unsigned long)p_data[i].sbuf.st_size, date1,date2, date3, patch); } } } else { printf("Problem getting information\n"); perror(argv[i+1]); } free(p_data), p_data=NULL; } return 0; }
Ok. Le problème est dans l'affichage. Tu t'obstines à afficher ce qu'il y a dans la ligne de commande, alors qu'il faut afficher le nom de fichier qui est dans le le tableau.Envoyé par melmouj
Tu n'as donc pas compris pourquoi on avait ajouté le nom du fichier dans la structure... C'est désespérant...
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103 /* POSIX.1 */ #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> /* ISO C */ #include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> #include <assert.h> #define FMT_TIME "%Y%m%d-%T" #define Max 1000 struct data { struct stat sbuf; char *file_name; }; static int compar_size(const void * pt_a, const void * pt_b) { const struct data * pt_da=pt_a; const struct data * pt_db=pt_b; return pt_da->sbuf.st_size - pt_db->sbuf.st_size; } static void display(struct data const *p_data, int nbr) { int j; for(j=0; j <nbr; j++) { int mode=p_data[j].sbuf.st_mode; char * patch=p_data[j].file_name; char date1[Max]; char date2[Max]; char date3[Max]; strftime (date1,sizeof date1,FMT_TIME, gmtime (&p_data[j].sbuf.st_mtime)); strftime (date2,sizeof date2,FMT_TIME, gmtime (&p_data[j].sbuf.st_atime)); strftime (date3,sizeof date3,FMT_TIME, gmtime (&p_data[j].sbuf.st_ctime)); if(S_ISDIR (mode)) { printf ("%10lu %20s %s %s %s\n",(unsigned long)p_data[j].sbuf.st_size, date1,date2, date3, patch); } //if(S_ISLNK(mode)) printf("%s S File size %ld\n", argv[j], if(S_ISREG (mode)) { printf ("%10lu %20s %s %s %s\n",(unsigned long)p_data[j].sbuf.st_size, date1,date2, date3, patch); } } } int main (int argc, char *argv[]) { int nbr=argc - 1; if (nbr != 0) { struct data *p_data = malloc (nbr * sizeof * p_data); if (p_data != NULL) { int result=0; { int i; for(i=0; !result && i < nbr; i++) { result=stat(argv[i+1], &p_data[i].sbuf); p_data[i].file_name = argv[i + 1]; } if(!result) { display(p_data, nbr); puts(""); qsort(p_data, nbr, sizeof *p_data, compar_size); display(p_data, nbr); puts(""); } else { printf("Problem getting information\n"); perror(argv[i+1]); } } free(p_data), p_data=NULL; } assert (p_data == NULL); } else { printf ("pas de parametres\n"); } return 0; }
Merci Emmanuel
si j'ai compris prq on a ajouté le nom de fichier ds la structure.
tu as raison c'est un probleme d'affichage,
il faut que j'affiche la taille et le nom de fichier qui est ds le tableau
(sinon je continue à afficher le nom du fichier avec la liste donnée par le shell dans argv)
enfin c'est bon
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 printf ("%10lu %20s %s %s %s\n",(unsigned long)p_data[i].sbuf.st_size, date1,date2, date3, p_data[i].file_name);
Bonjour
encore moi, j'ai une petite question:
dans le cas ou il ya 200000 parametres (càd le cas d'un repertoire qui contient 200000 fichiers)
j'ai ce petit message
arg list toot long (càd trop de paramétres)
si quelqu'un à une idée
Merci
Ben oui, l'expansion de '*' par le système a ses limites... L'idée est de passer un paramètre genre "*.c", et de l'utiliser avec les fonctions de lecture de répértoire les plus standards possibles (POSIX.1) comme opendir(), readdir() etc... de nombreux exemples ont déjà été postés...Envoyé par melmouj
Pour aller plus loin, la lecture récursive est assez 'tricky', mais c'est un interessant exercice de reflexion...
Commence par une lecture simple d'un répertoire (rappel : le répertoire courant est "." sur la plupart des systèmes)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 ... = opendir(...) while (readdir(...) != NULL) { ... }
voila
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 int main (int argc, char *argv[]) { DIR *rep=opendir("."); if (rep != NULL) { struct dirent *dir; while ((dir=readdir(rep)) != NULL) { printf("%s\n", dir->d_name); } closedir(rep), rep=NULL; } .................. }
Un peu incomplet, mais ok.Envoyé par melmouj
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 #include <dir.h> #include <dirent.h> #include <stdio.h> int main (int argc, char *argv[]) { DIR *rep = opendir ("."); if (rep != NULL) { struct dirent *dir; while ((dir = readdir (rep)) != NULL) { printf ("%s\n", dir->d_name); } closedir (rep), rep = NULL; } return 0; }
Partager