[C] Prendre plusieurs argument en compte

Prendre plusieurs argument en compte [C] - C - Programmation

Marsh Posté le 26-11-2007 à 13:20:57    

salut a tous ,
 
bon voila j'ai un projet  à réaliser , un programme qui fait la meme chose que "ls" .
 
Mon probleme est de prendre en compte plusieurs options , par exemple pour le ls on peux avoir : ls -lr ou ls -l -r  
sachant que les options correspondent aux arguments envoyez au programme. Je sais facilement gérer ls -l ou ls -r mais pas l'association des deux.
 
Si quelqu'un a une idée a me transmettre , je ne demande pas forcement du code mais l'idée general serais deja pas mal étant donné que j'ai vraiment aucune idée pour ce probleme la .  
 
merci d'avance

Reply

Marsh Posté le 26-11-2007 à 13:20:57   

Reply

Marsh Posté le 26-11-2007 à 14:25:07    

Ben le mieux c'est de regarder comment la commande ls gère ses arguments:
http://minnie.tuhs.org/UnixTree/V7 [...] /ls.c.html
Quoique pour un debutant c'est pas super simple...
 
Donc en fait c'est simple: tu fais une boucle qui analyse chaque argument et tu modifies des drapeaux en fonction de ce que tu trouves comme option


Message édité par breizhbugs le 26-11-2007 à 14:27:38
Reply

Marsh Posté le 26-11-2007 à 14:28:03    

Il te suffit de parcourir argv et de lister les actions à effectuer, par exemple sous forme de flags.

 

Ensuite à l'affichage de la liste des fichiers, tu zieutes ton/tes flag(s) et tu ajoutes les options d'affichage correspondantes.

 

edit : [:benou_grilled]


Message édité par Elmoricq le 26-11-2007 à 14:28:30
Reply

Marsh Posté le 26-11-2007 à 15:26:45    

Signalons l'existence de la fonction getopt (dans sa version non-GNU), que de trop nombreux débutants ignorent, par pure paresse ou alors par crainte de passer plus de temps à lire et comprendre la page man que de réimplémenter la fonction from scratch.
 
Une fois n'est pas coutume, ce n'est pas le cas avec cette fonction, qui s'occupe de se genre de tâche facilement et efficacement.

Reply

Marsh Posté le 26-11-2007 à 15:44:21    

merci de vos réponses , je vais me mettre au travail sur cette base la :)
 
Autre petite question sur mon code pour l'option -R ( affiche le repertoire courant ainsi que tous les sous repertoire )
 
J'ai donc crée une fonction recursive qui s'apelle elle meme (normal c'est recursif me direz vous ! ) a chaque fois qu'elle rencontre un repertoire.
 

Code :
  1. int option_R(char *str)
  2. {
  3. struct dirent *lecture;
  4. rep = opendir(str);
  5. while ((lecture = readdir(rep)))
  6. {
  7.   if (lecture->d_type) // si le type est different de 0
  8.    {
  9.      my_putstr(lecture->d_name); // affiche le nom du repertoire  
  10.      option_R(lecture->d_name); // passe le nom du repertoire a la fonction
  11.    }
  12. else
  13. ...


 
Mais apres test il ne prend pas en compte les repertoires , et si je fais un affichage du d_type a l'aide de my_putchar ('0' + d_type) il me renvois 0 pour chaque fichier et pour les repertoires aussi donc normal qu'il ne rentre plus dans le if ...
 
ma question donc : comment faire pour verifier autrement , ou correctement que c'est un repertoire ?  
 
voila merci d'avance de votre aide.

Reply

Marsh Posté le 26-11-2007 à 16:32:19    

tpierron a écrit :

Signalons l'existence de la fonction getopt (dans sa version non-GNU)


:non:
 
getopt() n'est ni ISO ni POSIX, cette fonction n'est pas standard et n'existe que sur certains systèmes.

Reply

Marsh Posté le 26-11-2007 à 16:50:49    

ole68 a écrit :

ma question donc : comment faire pour verifier autrement , ou correctement que c'est un repertoire ?

 

Regarde du côté de la fonction stat() que tu peux utiliser avec lecture->d_name, qui rempli une structure "struct stat" dans laquelle tu pourras tester le champ st_mode avec le flag S_IFDIR.


Message édité par Elmoricq le 26-11-2007 à 16:52:04
Reply

Marsh Posté le 26-11-2007 à 22:53:21    

il faut que je balance mes man alors, chez, ils me disent ça
CONFORMING TO
       getopt():
              POSIX.2 and POSIX.1-2001
 

Elmoricq a écrit :


:non:
 
getopt() n'est ni ISO ni POSIX, cette fonction n'est pas standard et n'existe que sur certains systèmes.


Reply

Marsh Posté le 26-11-2007 à 22:58:55    

Ah oui tiens, c'est POSIX.2 [:fou]
Première fois que cette page me fait défaut.
 
Par contre après quelques recherches il s'avère qu'il y a un petit souci dans la rédaction de la norme à propos de cette fonction, mais ça n'enlève pas le fait que ce soit standard (en tout cas sur *nix, je ne connais pas la conformité des OS Microsoft avec POSIX.2).  
Toutes mes confuses. [:romf]

Reply

Marsh Posté le 27-11-2007 à 00:43:23    

Citation :

Regarde du côté de la fonction stat() que tu peux utiliser avec lecture->d_name, qui rempli une structure "struct stat" dans laquelle tu pourras tester le champ st_mode avec le flag S_IFDIR.


 
alors voila j'ai fait avec stat et probleme , donc deja voici le bout de code  
 

Code :
  1. if (S_ISDIR(info.file->st.mode) == 0) // si c'est un repertoire , l'envoyez dans l'option R
  2. {
  3. option_R(lecture->d_name);
  4. }


 
et la probleme enfaite il vois tous comme des repertoires , car quand on remplace la ligne dans le if par un my_putstr(lecture->d_name) il affiche tous les fichiers / dossier  
et si on change la condition '==' par '!=' il affiche rien du tout ...

Reply

Marsh Posté le 27-11-2007 à 00:43:23   

Reply

Marsh Posté le 27-11-2007 à 18:19:38    

Utilise getopt. C'est un ordre ;)
 
Non sérieusement, si ton OS à getopt (ou même getopt_long) c'est la seule façon de s'assurer que ton programe aura un comportemet "standard" (pour ton OS). Je peux t'assurer qu'autrement, tu auras tout un tas de cas que tu n'aura pas prévu et que tu gerera de façon bancale (non-option argument avant le dernier flag, argument d'un flag collé où non à son flag...)

Reply

Marsh Posté le 27-11-2007 à 19:18:06    

ole68 a écrit :

Code :
  1. if (S_ISDIR(info.file->st.mode) == 0) // si c'est un repertoire , l'envoyez dans l'option R



 
Tel qu'écrit là, tu testes si ce n'est pas un répertoire. Pour tester si c'est un répertoire, il faut simplement faire : if (S_ISDIR(info.file->st.mode)).
 
Mais tu as déjà testé ce cas en mettant "!= 0". Le problème doit donc se situer au niveau de ton appel à la fonction stat(). Ta fonction étant récursive, tu ne peux pas utiliser directement ce que te renvoies readdir(), puisque ton répertoire courrant ne sera certainement pas positionner au bon endroit. Il faudra alors concaténer des "path" (chemin de répertoire ?).

Reply

Marsh Posté le 27-11-2007 à 19:30:40    

Citation :

Ta fonction étant récursive, tu ne peux pas utiliser directement ce que te renvoies readdir(), puisque ton répertoire courrant ne sera certainement pas positionner au bon endroit. Il faudra alors concaténer des "path" (chemin de répertoire ?).


 
oué donc jai modifiez un peu ce que j'ai fait , et maitenant il entre bien dans le repertoire mais il essais aussi de rentrer dans des fichiers qu'il prend comme des repertoires :s  
 
sinon d'apres ce que jai compris de ce que tu me dis : il faudrais crée le chemin du repertoire et non entrer le nom du repertoire ?  
donc au lieu de faire option_R(lecture->d_name) faire quelque chose comme option_R(/repertoire precedent/lecture->d_name) ( bon biensur je sais bien que c'est pas exactement sa mais c'est pour l'exemple )

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed