Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1671 connectés 

  FORUM HardWare.fr
  Programmation
  C

  [C] Prendre plusieurs argument en compte

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C] Prendre plusieurs argument en compte

n°1648851
ole68
Posté le 26-11-2007 à 13:20:57  profilanswer
 

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

mood
Publicité
Posté le 26-11-2007 à 13:20:57  profilanswer
 

n°1648890
breizhbugs
Posté le 26-11-2007 à 14:25:07  profilanswer
 

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
n°1648891
Elmoricq
Modérateur
Posté le 26-11-2007 à 14:28:03  profilanswer
 

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
n°1648937
tpierron
Posté le 26-11-2007 à 15:26:45  profilanswer
 

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.

n°1648948
ole68
Posté le 26-11-2007 à 15:44:21  profilanswer
 

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.

n°1648983
Elmoricq
Modérateur
Posté le 26-11-2007 à 16:32:19  profilanswer
 

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.

n°1649000
Elmoricq
Modérateur
Posté le 26-11-2007 à 16:50:49  profilanswer
 

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
n°1649199
morph
Posté le 26-11-2007 à 22:53:21  profilanswer
 

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.


n°1649200
Elmoricq
Modérateur
Posté le 26-11-2007 à 22:58:55  profilanswer
 

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]

n°1649237
ole68
Posté le 27-11-2007 à 00:43:23  profilanswer
 

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 ...

mood
Publicité
Posté le 27-11-2007 à 00:43:23  profilanswer
 

n°1649808
matafan
Posté le 27-11-2007 à 18:19:38  profilanswer
 

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...)

n°1649841
tpierron
Posté le 27-11-2007 à 19:18:06  profilanswer
 

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 ?).

n°1649847
ole68
Posté le 27-11-2007 à 19:30:40  profilanswer
 

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 )


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  [C] Prendre plusieurs argument en compte

 

Sujets relatifs
souci avec un script "compte à rebours"lancer un sql avec un argument
Passer un nom de méthode et ses paramètres en argumentRecherche fonction pour ajouter plusieurs fois un meme paragraphe
[PHP] Upload de fichier en plusieurs partiesTransaction sur plusieurs scripts php
Pblm héritage et méthode "sans" argument...Gerer plusieurs fenêtres OpenGL.
Compiler plusieurs variables [simple]batch: Découper un fichier en plusieurs fichiers
Plus de sujets relatifs à : [C] Prendre plusieurs argument en compte


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR