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
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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 p = strchr(machaine, '\n'); if (p != NULL) // le '\n' a été trouvé *p = 0; // on l'enlève !
"La haine seule fait des choix" - Koan Zen
"Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
"Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
Faites du Prolog, ça vous changera les idées !
Ma page Prolog
Mes codes sources commentés
Mon avatar : La Madeleine à la veilleuse de Georges de La Tour
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().Envoyé par Trap D
Pas de Wi-Fi à la maison : CPL
bonjour
j'arrive pas à copier le contenu de sbuf.st_size ds string
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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).Envoyé par melmouj
Pas de Wi-Fi à la maison : CPL
voila la suite
ça me donne:
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 #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?
SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.
"Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
Apparently everyone. -- Raymond Chen.
Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.
Il faut commencer par écrire un algorithme qui tient la route...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...
Pas de Wi-Fi à la maison : CPL
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 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 ?Envoyé par melmouj
Pas de Wi-Fi à la maison : CPL
ça marche pas qd je fait
return (strcmp(*(int *)a, *(int *)b));
j'ai essayé comme ça mais encore des erreurs
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 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 :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'.
Pas de Wi-Fi à la maison : CPL
ç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 : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 struct stat { char T[100]; }; struct stat sbuf;
Non.Envoyé par melmouj
Code : Sélectionner tout - Visualiser dans une fenêtre à part struct stat T[100];
Pas de Wi-Fi à la maison : CPL
Et bien il suffit de demander au lieu de bricoler.Envoyé par melmouj
Tu sais faire un tableau d'int :
plus généralement un tableau de type T
Code : Sélectionner tout - Visualiser dans une fenêtre à part int a[123];
Ici, on veut un tableau de 'struct stat'. Donc :
Code : Sélectionner tout - Visualiser dans une fenêtre à part T a[456];
tout simplement (tailles arbitraires).
Code : Sélectionner tout - Visualiser dans une fenêtre à part struct stat a[789];
Rappel : struct stat est défini dans <sys/stat.h>
Pas de Wi-Fi à la maison : CPL
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 : 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 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...Envoyé par melmouj
En fait, tu fais tout en une opération avec ceci :
ce qui es correct.
Code : Sélectionner tout - Visualiser dans une fenêtre à part 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).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...
Pas de Wi-Fi à la maison : CPL
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