je sais qu'elle est faisable par
strftime (date1,29,"%m/%d/%Y %T", gmtime (&sbuf.st_mtime));
tu m'a dit que si possible de retirer les '\n' ds ctime(), je sais pas comment!!
Merci de ton Aide
Version imprimable
je sais qu'elle est faisable par
strftime (date1,29,"%m/%d/%Y %T", gmtime (&sbuf.st_mtime));
tu m'a dit que si possible de retirer les '\n' ds ctime(), je sais pas comment!!
Merci de ton Aide
Tu les pistes en faisant un
Code:
1
2
3
4
5 p = strchr(machaine, '\n'); if (p != NULL) // le '\n' a été trouvé *p = 0; // on l'enlève !
Mais dans le cas du ctime(), ça ne marchera qu'avec une copie de la chaine. C'est tellement compliqué qu'il vaut mieux utiliser strftime().Citation:
Envoyé par Trap D
bonjour
j'arrive pas à copier le contenu de sbuf.st_size ds stringCode:
1
2
3
4
5
6
7
8
9
10
11
12
13 char string[40]; mode=sbuf.st_mode; size=sbuf.st_size; patch=argv[i]; char * pt = "sbuf.st_size"; strcpy(string, pt); printf("%s\n", string); return 0; exit (1);
Merci
Le contenu de sbuf.st_size est probablement un entier. Il faut utiliser sprintf(), le formatteur et le cast qui vont bien pour en faire une représentation textuelle (en décimal, par exemple).Citation:
Envoyé par melmouj
voila la suite
ça me donne:Code:
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 #include <sys/types.h> #include <sys/stat.h> #include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h> int tri(const void *,const void *); int main (int argc, char *argv[]) { int i, mode; int size; int result; char * patch=NULL; char date1[30]; char date2[30]; char date3[30]; struct stat sbuf; for(i=1; i < argc; i++) { result=stat(argv[i], &sbuf); if(result == 0) { mode=sbuf.st_mode; size=sbuf.st_size; char string[40]; char * pt = "sbuf.st_size"; //sprintf(string,"%d", (int *)sbuf.st_size); //printf("%s\n", string); // strftime (date1,29,"%m/%d/%Y %T", gmtime (&sbuf.st_mtime)); // strftime (date2,29,"%m/%d/%Y %T", gmtime (&sbuf.st_atime)); // strftime (date2,29,"%m/%d/%Y %T", gmtime (&sbuf.st_atime)); // patch=argv[i]; //if(S_ISDIR (mode)) { //printf ("%12d %s %s %s\n",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("%12d %s %s %s\n",sbuf.st_size,date1,date2,date3,patch); //} sprintf(string,"%d", (int *)sbuf.st_size); qsort((void*)string,40,sizeof(string),tri); printf("%s\n", string); } else printf("Problem getting information\n"); } return 0; } int tri(const void * a, const void * b) { return(strcmp(*(int *)a,*(int *)b)); }
cc -c conversion.c
conversion.c: Dans la fonction « tri »:
conversion.c:62: attention : passage de l'argument n°1 de « strcmp » transforme un entier en pointeur sans transtypage
conversion.c:62: attention : passage de l'argument n°2 de « strcmp » transforme un entier en pointeur sans transtypage
par contre ds ce cas return(strcmp(*(char **)a,*(char **)b));
ça fonctionne sasn erreur.
Merci de m'aider
ben... strcmp((const char *)a, (const char *)b) ne suffit-il pas?
Il faut commencer par écrire un algorithme qui tient la route...Citation:
Envoyé par melmouj
Pour utiliser qsort(), il faut un tableau. Il faut constituer ce tableau en lisant chaque élément du repertoire (l'agrandir si nécessaire).
Ensuite, on trie le tableau selon le critère choisi (implémenté dans la fonction de comparaison curieusement appelée 'tri' ici...)
Je conseille un tableau de 'struct stat'.
Ensuite, on verra les problèmes de syntaxe...
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 struct stat sbuf; char tab[100]; for(i=1; i < argc; i++) { . . . . sprintf(tab,"%d", (int *)sbuf.st_size); printf("%s\n", tab); for(j=1;j<argc;j++) { qsort((void*)tab,32,sizeof(tab),tri); } } int tri(const void * a, const void * b) { return (strcmp(*(char **)a, *(char **)b)); }
Tu veux trier des caractères ? Qu'est-ce que tu ne comprends pas dans les réponses précédentes ?Citation:
Envoyé par melmouj
ça marche pas qd je fait
return (strcmp(*(int *)a, *(int *)b));
j'ai essayé comme ça mais encore des erreurs
Code:
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 struct stat sbuf; char T[100]; for(i=1; i < argc; i++) { result=stat(argv[i], &sbuf); if(result == 0) { mode=sbuf.st_mode; size=sbuf.st_size; sprintf(T,"%d", (int *)sbuf.st_size); printf("%s\n", T); puts(T); qsort((int *)T,argc,sizeof(int),compar); } else printf("Problem getting information\n"); } return 0; } int compar(const void *a, const void *b) { if(*(int *)a<(*(int *)b) return (*(int *)a); return 0; }
Il faut cesser de programmer au hasard. Quels sont les mots que tu ne comprends pas dans :Citation:
Envoyé par melmouj
Citation:
Pour utiliser qsort(), il faut un tableau. Il faut constituer ce tableau en lisant chaque élément du repertoire (l'agrandir si nécessaire).
Ensuite, on trie le tableau selon le critère choisi (implémenté dans la fonction de comparaison curieusement appelée 'tri' ici...)
Je conseille un tableau de 'struct stat'.
ça: un tableau de 'struct stat'.
char T[100]; est un tableau,
on copie dedons sprintf(T,"%d", (int *)sbuf.st_size);
tu veut dire :
Code:
1
2
3
4
5
6 struct stat { char T[100]; }; struct stat sbuf;
Non.Citation:
Envoyé par melmouj
Code:struct stat T[100];
Et bien il suffit de demander au lieu de bricoler.Citation:
Envoyé par melmouj
Tu sais faire un tableau d'int :
plus généralement un tableau de type TCode:int a[123];
Ici, on veut un tableau de 'struct stat'. Donc :Code:T a[456];
tout simplement (tailles arbitraires).Code:struct stat a[789];
Rappel : struct stat est défini dans <sys/stat.h>
Merci de ton aide emmanuel,
voila ce que j'ai fait, je suis bloqué.
tu m'a dis il faut copie sbuf[i].st_size ds un tableau.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 struct stat sbuf[argc]; char T[50]; for(i=1; i < argc; i++) { result=stat(argv[i], &sbuf[i]); if(result == 0) { mode=sbuf[i].st_mode; size=sbuf[i].st_size; sprintf(T,"%d", (int *)sbuf[i].st_size); printf("%s\n", T); // qsort((int *)sbuf[i].st_size), 20, sizeof((int *)sbuf[0].st_size)),tri); ......................... } // int tri(const void * a, const void * b) { //return((*(int *)a - *(int *)b); //}
je l'ai deja fait printf("%s\n", T); il donne:
1118
1044782
48
10997
1481
1312
456
80
204
80
48
1243
1968
491
267
80
214
12201
72
158
par contre qsort ne marche pas.
NON! J'ai dit de constituer un tableau de struct stat (ce que tu as fait, d'ailleurs). Il suffit maintenant de recopier chaque struct stat mise a jour par stat() dans le tableau...Citation:
Envoyé par melmouj
En fait, tu fais tout en une opération avec ceci :
ce qui es correct.Code:result=stat(argv[i], &sbuf[i]);
Relis mon texte. J'ai dit qu'il fallait d'abord constituer le tableau de struct stat, et ensuite (donc hors de la boucle), il faut appeler qsort() pour faire le tri sur des élements du tableau (qui sont évidemment des struct stat).Citation:
je l'ai deja fait printf("%s\n", T); il donne:
1118
1044782
48
10997
1481
1312
456
80
204
80
48
1243
1968
491
267
80
214
12201
72
158
par contre qsort ne marche pas.
En fait, tu ne devrais pas aborder un thème tant que ne maîtrise pas le précédent. Savoir utiliser qsort(), c'est tout un art, et si en même temps tu patauge dans les struct stat, tu ne vas pas y arriver. Il faut faire une chose à la fois. Commence par apprendre à utiliser qsort() avec
- des entiers
- des chaines
- des structure (en choisissant un champ de tri particulier).
En ayant en tête que ce sui est passé à la fonction de comparaison, ce sont 2 adresses d'éléments du tableau. Elles arrivent de façon anonyme (void const *), et pour les utiliser il faut probablement 2 pointeurs locaux du bon type...