cydoo Overclocking : sano2k Le salon de discussion : Diesel, 1 utilisateur anonyme et 12 utilisateurs inconnus

 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

codage de ls

n°5323
the tortue​-man
tortalouga
Posté le 31-03-2005 à 19:29:27  profilanswer
 

:hello:  
voila, comme deather m'a donné envi de coder un ls, je me lance :sol:
mais j'arrive a un endroi ou j'arrive pas a trouver mes erreurs.
je lui demande de mettre un d devant le nom du repertoir, mais voila, il ne fait pas la distinction entre un fichier et un repertoir :D
donc il m'affiche un d devant tous les fichiers et repertoires
 
Donc si une âmes charitable pouvait m'aidé :)
voici mon code ;)
 

Code :
  1. #include <stdio.h>
  2. #include <sys/types.h>
  3. #include <sys/stat.h>
  4. #include <dirent.h>
  5. #include <string.h>
  6. #include <unistd.h>
  7. #include <errno.h>
  8. #include <stdlib.h>
  9. /* On calcul le nb de dossier passé en arg
  10. avec une boucle qui supp les arg qui comence par - */
  11. int How_many_folders(int argc, char **argv)
  12. {
  13. int args = 0, argc_parsing;
  14. for (argc_parsing = 1; argc_parsing < argc; argc_parsing++)
  15. {
  16.  if (argv[argc_parsing][0] != '-')
  17.  {
  18.   args++;
  19.  }
  20. }
  21. return args;
  22. }
  23. int main(int argc, char **argv)
  24. {
  25. int argc_parsing, argv_parsing, argc_parsing_acess, argc_parsing_folder = 0, how_many_folder, tmp, l_parsing = 0;
  26. DIR *s_Directory_stream;
  27. struct dirent *s_Directory_Contents;
  28. struct stat *file_acess = (struct stat*)malloc(sizeof(struct stat));
  29. how_many_folder = How_many_folders(argc, argv);
  30. char **file_list;
  31. file_list = (char**)malloc(how_many_folder);
  32. for (tmp = 0; tmp < how_many_folder; tmp++)
  33. {
  34.  file_list[tmp] = (char*)malloc(512);
  35. }
  36. for (argc_parsing = 1; argc_parsing < argc; argc_parsing++)
  37. {
  38.  if (argv[argc_parsing][0] == '-') /* C'est une option */
  39.  {
  40.   for (argv_parsing =1; argv_parsing < strlen(argv[argc_parsing]); argv_parsing++)
  41.   {
  42.    switch (argv[argc_parsing][argv_parsing])
  43.    {
  44.     case 'l':
  45.      l_parsing = 1; /* On attribu 1 a l_parsing pour savoir si on a passer l'arg l */
  46.     break;
  47.     case 'R':
  48.      printf("option : R\n" );
  49.     break;
  50.     default:
  51.     printf("Segmentation fault\n" );
  52.    }
  53.   }
  54.  }
  55.  else /* C'est un repertoire */
  56.  {
  57.   /* On copie ce que contien argv[argc_parsing] dans file_list[argc_parsing_folder] */
  58.   strcpy(file_list[argc_parsing_folder++], argv[argc_parsing]);
  59.  }
  60. }
  61. for (tmp = 0; tmp < how_many_folder; tmp++)
  62. {
  63.  printf("%s\n\n", file_list[tmp]);
  64.  s_Directory_stream = opendir(file_list[tmp]);
  65.  while ((s_Directory_Contents = readdir(s_Directory_stream)) != NULL )
  66.  {
  67.   if (stat(file_list[tmp], file_acess) == -1)
  68.   {
  69.    printf("%s : %s\n", s_Directory_Contents->d_name, strerror(errno));
  70.    continue;
  71.   }
  72.   if ( (S_ISDIR(file_acess->st_mode)) && (l_parsing == 1) )
  73.   {
  74.    printf("d " );
  75.    break;
  76.   }
  77.   printf("%s\n", s_Directory_Contents->d_name);
  78.  }
  79. }
  80. exit(0);
  81. }


 
PS : je suis un vrai debutant, ne faites pas gaffe aus fautes d'orthographes dans le nom de me variables
meme mon prof me dit que c'est nul :D


Message édité par the tortue-man le 31-03-2005 à 19:32:13

---------------
Celui qui veut mon adresse MSN => bougieskater@hotmail.com
 
mood
Google
Posté le 31-03-2005 à 19:29:27  profilanswer
 

n°5324
Deather2
OpenBSD: the way to go!
Posté le 31-03-2005 à 19:37:45  profilanswer
 

:ouch:  
 
C'est qui ton prof? :whistle:

n°5325
Deather2
OpenBSD: the way to go!
Posté le 31-03-2005 à 20:05:10  profilanswer
 

Code :
  1. char **file_list;
  2.      file_list = (char**)malloc(how_many_folder);
  3.      for (tmp = 0; tmp < how_many_folder; tmp++)
  4.      {       
  5.             file_list[tmp] = (char*)malloc(512);
  6.      }


 
C'te leak :/


Message édité par Deather2 le 31-03-2005 à 20:05:42
n°5327
nicodache
marmotte en chocolat concept ©
Posté le 31-03-2005 à 21:04:47  profilanswer
 

bah ca leak pas tant qu'il libère quand il a plus besoin, le plus possible ;)


---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°5328
Deather2
OpenBSD: the way to go!
Posté le 31-03-2005 à 21:07:04  profilanswer
 

Justement il libère pas lol :D

n°5329
the tortue​-man
tortalouga
Posté le 31-03-2005 à 21:08:45  profilanswer
 

bon voila, apres une journée de travail acharné, avec les conseil de mon prof :p
je vien enfin de trouver d'ou ça vien :p
 
pour ceux que ça interese, je peux mettre mon code modifier :)


---------------
Celui qui veut mon adresse MSN => bougieskater@hotmail.com
 
n°5330
nicodache
marmotte en chocolat concept ©
Posté le 31-03-2005 à 21:08:45  profilanswer
 

c'est sensé se libérer tout seul grace au bon compilateur, nan ? :D


---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°5331
Deather2
OpenBSD: the way to go!
Posté le 31-03-2005 à 21:35:24  profilanswer
 

C'est tjrs beau de rêver nico :D

Citation :

$ valgrind -v ./my_ls -lR ~


Il râle bien le valgrind [:dslam]

n°5332
nicodache
marmotte en chocolat concept ©
Posté le 31-03-2005 à 23:34:00  profilanswer
 

ha, parce qu'en plus ca compile ?! :eek:


---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°5333
Deadog
Dain Bramaged
Posté le 01-04-2005 à 02:55:59  profilanswer
 

quand je vois ça :

Code :
  1. #     DIR *s_Directory_stream;
  2. #     struct dirent *s_Directory_Contents;
  3. #     struct stat *file_acess = (struct stat*)malloc(sizeof(struct stat));
  4. #   
  5. #   
  6. #     how_many_folder = How_many_folders(argc, argv);
  7. #     char **file_list;
  8. #     file_list = (char**)malloc(how_many_folder);
  9. #     for (tmp = 0; tmp < how_many_folder; tmp++)
  10. #     {
  11. #         file_list[tmp] = (char*)malloc(512);
  12. #     }


 
j'ai envie de faire un meurtre :D


---------------
* On sais qu'on est un ingénieur si on n'a pas de vie social et qu'on peux le prouver mathématiquement
* "pluralitas non est ponenda sine necessitate" (Les choses essentielles ne doivent pas être multipliées sans nécessité) Guillaume d'Ockham

n°5337
Deather2
OpenBSD: the way to go!
Posté le 01-04-2005 à 18:09:27  profilanswer
 

Deadog a écrit :

quand je vois ça :

Code :
  1. #     DIR *s_Directory_stream;
  2. #     struct dirent *s_Directory_Contents;
  3. #     struct stat *file_acess = (struct stat*)malloc(sizeof(struct stat));
  4. #   
  5. #   
  6. #     how_many_folder = How_many_folders(argc, argv);
  7. #     char **file_list;
  8. #     file_list = (char**)malloc(how_many_folder);
  9. #     for (tmp = 0; tmp < how_many_folder; tmp++)
  10. #     {
  11. #         file_list[tmp] = (char*)malloc(512);
  12. #     }


 
j'ai envie de faire un meurtre :D


 
Me tue pas s'il te plait :whistle:  
Non sérieusement, y'a mieux pour faire une liste de pointeurs ?
 
Je précise qu'à la base c'est un projet à moi et que lui en refait un de son côté, inspiré du mien (mais qu'inspiré :D).
 
À la fin je free bien le tout.
Par contre, y'a dès fois ou des appels systèmes me retournes des pointeurs vers des structures, celle la je dois les free ? Car valgrind râle un peu opur le mien.
 
Autre chose, à quoi correspond le 1er numéro après les droits en ls -l ? et le total XXXXX au début de chaque dossier?
Merci ;)

n°5339
Deadog
Dain Bramaged
Posté le 01-04-2005 à 18:51:04  profilanswer
 

Code :
  1. DIR *s_Directory_stream=NULL;
  2. struct dirent *s_Directory_Contents=NULL;
  3. struct stat *file_acess=NULL;
  4. char **file_list=NULL;
  5.    
  6. if((file_access = (struct stat*) calloc(1, sizeof(struct stat))) == NULL)
  7.   exit(1);   
  8. how_many_folder = How_many_folders(argc, argv);
  9. if((file_list = (char**) calloc(how_many_folder, sizeof (char *))) == NULL)
  10.   exit(1);
  11. for (tmp = 0; tmp < how_many_folder; tmp++)
  12. {
  13.   if((file_list[tmp] = (char*) calloc(512, sizeof(char))) == NULL)
  14.     exit(1);
  15. }


Message édité par Deadog le 01-04-2005 à 19:03:25
n°5342
Deather2
OpenBSD: the way to go!
Posté le 01-04-2005 à 19:52:20  profilanswer
 

Ok merci. Ça change quoi concrètement de changer les malloc par des callocs?
Merci ;)

n°5343
Deadog
Dain Bramaged
Posté le 01-04-2005 à 20:15:23  profilanswer
 

ça initialise la mémoire à 0 essentiellement

n°5344
Deather2
OpenBSD: the way to go!
Posté le 01-04-2005 à 20:16:32  profilanswer
 

Ah d'accord c'est cool, ça m'évitera un bzero juste après un malloc ;)
Merci pour les infos

n°5345
Deather2
OpenBSD: the way to go!
Posté le 01-04-2005 à 20:36:32  profilanswer
 

Bon si y'a des courageux, je post mon code :whistle:
Il gère les options suivantes:
-l : Listage long (pas au point, mais presque)
-d : Affichage du répertoire lui même
-R : Récursif, (edit) Je viens juste de le faire marcher :D
-t : Pas fais :D
-r : Pas fais non plus
 
http://imaga.zapto.org/~deather/main.c


Message édité par Deather2 le 01-04-2005 à 20:47:21
n°5347
Deadog
Dain Bramaged
Posté le 01-04-2005 à 22:13:39  profilanswer
 

Code :
  1. s_file = (struct stat*)calloc(1, sizeof(struct stat));


 
:fou:

n°5349
Deather2
OpenBSD: the way to go!
Posté le 01-04-2005 à 22:26:09  profilanswer
 

:??:

n°5350
Deadog
Dain Bramaged
Posté le 01-04-2005 à 23:36:12  profilanswer
 

le contrôle d'erreur tu connais ?

n°5351
nicodache
marmotte en chocolat concept ©
Posté le 01-04-2005 à 23:45:06  profilanswer
 

Code :
  1. if ((s_file = (struct stat*)calloc(1, sizeof(struct stat))) == 0) { // c'est bien 0 pour les erreurs ?
  2.     printf("erreur !\n" );
  3.     exit(1);
  4. } else {
  5.     // continuer le traitement !
  6. }


---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°5352
Deadog
Dain Bramaged
Posté le 02-04-2005 à 00:16:10  profilanswer
 

quand une fonction d'alloc foire c'est NULL
et pas besoin du else ;)

n°5353
nicodache
marmotte en chocolat concept ©
Posté le 02-04-2005 à 02:12:33  profilanswer
 

ha vi, null :D
 
et pour le else, je sais, mais on m'a vaguement appris à programmer comme ca, bien structuré, même si la moitié des accolades sert parfois à rien :D


---------------
modérateur inside [:nicodache] plankaivoo [:nicodache] - ici powered - Je roule en micra 1l 55cv et je t'emmerde :o
n°5354
Deadog
Dain Bramaged
Posté le 02-04-2005 à 03:33:38  profilanswer
 

c'est mauvais, pke va faire ça sur une suite de traitement, tu vas te retrouver avec une indentation de malade :D
si la condition1 du if est éxécuté, il ne se passera rien après le exit (ou un return)


Message édité par Deadog le 02-04-2005 à 03:34:48
n°5355
Deather2
OpenBSD: the way to go!
Posté le 02-04-2005 à 07:37:07  profilanswer
 

Deadog a écrit :

le contrôle d'erreur tu connais ?


ah oui c'est vrai, merci

n°5623
KnX
To be or not to code.
Posté le 03-05-2005 à 17:29:34  profilanswer
 

accessoirement, le printf ca sort sur stdout, le message d'erreur de l'alloc n'a rien a y faire ;) y'a des fonctions exprès pour les erreurs  
( du genre perror ou assert, mais jdirais plutot perror vu qu'assert ne sert normalement qu'au débug)
ca vaut skeu ca vaut mais jme sers +/- de ca pour mes malloc :

Code :
  1. #define xmalloc(pointeur) \
  2.   {\
  3.     pointeur = malloc(sizeof(*pointeur));\
  4.     if (pointeur==NULL) \
  5.       { \
  6.         perror(__PROGNAME__); \
  7.         exit(errno); \
  8.       } \
  9.   }


---------------
/!\ KnX's bash NP : Norah Jones - Don't Miss You At All /!\
n°5625
Deadog
Dain Bramaged
Posté le 03-05-2005 à 18:11:08  profilanswer
 

strerror :D

n°5631
KnX
To be or not to code.
Posté le 04-05-2005 à 22:51:27  profilanswer
 

strerror ca renvoie une chaine juste nan ? faut ensuite la fprintfer sur le stderr, quel avantage % au perror ?
 
( ceci dit, entre abort et exit jme tate, abort fait vraiment dans l'urgence et laisse pas mal de bordel en plan, je me demande si c'est vraiment necessaire alors qu'il n'y a juste pas assez de mémoire )


Message édité par KnX le 04-05-2005 à 22:52:50

---------------
/!\ KnX's bash NP : Norah Jones - Don't Miss You At All /!\
n°5644
Deadog
Dain Bramaged
Posté le 09-05-2005 à 01:49:29  profilanswer
 

-perror écrit sur stderr, c'est pas pratique quand tu veux faire écrire l'erreur dans un log ou dans une fenêtre, ou autre
-perror de respecte pas la localisation
-perror n'est pas utilisable pour écrire une formulation "à ta sauce" de l'erreur
 
ensuite, sur la conformité, perror est ANSI C, tandis que strerror est ISO C89 (j'aurais tendance à privilégié le C89 face à l'ansi)


Message édité par Deadog le 09-05-2005 à 01:50:14
n°5645
KnX
To be or not to code.
Posté le 09-05-2005 à 09:44:08  profilanswer
 

- j'avais pas envisagé les log, c'est vrai que c'est pas bète, y'a juste a changer le stderr par un fichier pour choisir ou ca sort
- ca c'est super-méga-chiant, ca suffit a me convertir au strerr :D
- modifier le début ca me suffisait par contre
 
par contre, sur la norme je capte pas, ISO c'est C90, ANSI c'est C89 ou C99, il me semblait pas que perror était C89 (ce qui me convient) et pas C99 ( dans ce cas la, jm'en sers plus ).
 
.. jviens de regarder un peu, d'après 2 endroits, c'est du C89, donc "ca va" ( cela dit , ca résouds pas le pb de localisation, donc en fait non ...)  
 
Edit:
 
gcc compile perror en -ansi -pedantic sans pb, c'est donc pas du C99 ;)


Message édité par KnX le 09-05-2005 à 09:50:05

---------------
/!\ KnX's bash NP : Norah Jones - Don't Miss You At All /!\
n°5646
Deadog
Dain Bramaged
Posté le 09-05-2005 à 17:06:29  profilanswer
 

keske t'as contre le C99 ? :D

n°5647
Deather2
OpenBSD: the way to go!
Posté le 09-05-2005 à 19:56:54  profilanswer
 

D'apres la man page de NetBSD:

Citation :

STANDARDS
     The perror() function conforms to ANSI X3.159-1989 (``ANSI C'').


:)

n°5648
Deadog
Dain Bramaged
Posté le 09-05-2005 à 20:13:06  profilanswer
 

mes sources c'est les man pages quand même :D

n°5661
the tortue​-man
tortalouga
Posté le 17-05-2005 à 18:41:54  profilanswer
 

bon,voila, je recode mon ls avec l'aide de mon prof :)
voici mes source, (il est pas encore fini :D)
 
http://bougieskater.free.fr/my_projects/my_ls/
 
Vous en penssez quoi ?


---------------
Celui qui veut mon adresse MSN => bougieskater@hotmail.com
 
mood
Google
Posté le 17-05-2005 à 18:41:54  profilanswer
 


Aller à :
Ajouter une réponse
 

Hit Parade