Bonjour, je dois réaliser un programme en C sur Linux. Je sais que pour compiler en utilisant le terminal, il faut passer par ces étapes là:
gcc -c exemple.c
gcc -o exemple exemple.o
./exemple
Le fichier .c que je compile doit ouvrir un fichier (fopen, …). Je fait donc un printf("Entrez le nom du fichier") dans mon programme. Cependant, je voudrai savoir s'il est possible, directement sur le terminal, de faire appel à mon fichier tout en passant l'argument, comme ceci : exemple nom_du_fichier_a_ouvrir.txt.
Merci pour votre aide.
# Les arguments
Posté par Renault (site web personnel) . Évalué à 10. Dernière modification le 04 juin 2013 à 01:02.
Oui c'est parfaitement possible.
Pour cela il faut utiliser les arguments de la fonction main(). Petit exemple :
Tu verras que argv contient l'ensemble des arguments sous forme de chaine de caractères (chaque case de la liste des chaines = un argument passé en paramètre, dans l'ordre)
Il te suffit de tester l'argument 2 pour voir si c'est un nom de fichier valide et tu pourras l'utiliser sans problème. ;)
[^] # Re: Les arguments
Posté par Zenitram (site web personnel) . Évalué à 0.
Le 2ème argument, ou l'argument 1.
Les codeurs comptent à partir de 0 ;-).
Info pour ceux qui ne connaissent pas : argv[0] est le nom du programme appelant.
[^] # Re: Les arguments
Posté par delio . Évalué à 4.
ou pas.
[^] # Re: Les arguments
Posté par totof2000 . Évalué à 3. Dernière modification le 04 juin 2013 à 15:27.
http://crasseux.com/books/ctutorial/argc-and-argv.html
argv[0] représente la chaine utilisée pour appeler le programme et non le programma appelant.
[^] # Re: Les arguments
Posté par Zenitram (site web personnel) . Évalué à 0.
Euh… La formulation n'était peut-être pas terrible (je n'ai pas dit "le nom du programme qui lance le programme"), mais sinon ça veut dire la même chose… Si il faut être plus précis : le nom du programme appelant main() (ce programme ayant été lancé par le kernel, avec parfois un autre point d'entrée du programme, genre mainCRTStartup() qui appartient bien au programme et qui appelle main() ).
Mais la, on reste sur le tatillon… Et on parle de la même chose, juste le plaisir de causer.
[^] # Re: Les arguments
Posté par Krunch (site web personnel) . Évalué à 3.
Bah non.
Après tu vas me dire que j'interprète mal tes propos volontairement mais c'est pas grave parce que j'ai appris à ignorer tes réponses.
pertinent adj. Approprié : qui se rapporte exactement à ce dont il est question.
[^] # Re: Les arguments
Posté par Zylabon . Évalué à 1.
:)
Please do not feed the trolls
[^] # Re: Les arguments
Posté par totof2000 . Évalué à 2.
Tu peux expliquer ou tu veux en venir ? Je ne comprends pas ce que tu cherches à prouver.
[^] # Re: Les arguments
Posté par Zenitram (site web personnel) . Évalué à 2.
il trafique argv[0] en le forçant à une autre valeur que le nom du programme lancé (j’essaye d'éviter une malcompréhension sur le mot :) ), pour me faire mentir.
C'est un hack, qui est pas disponible partout. Si ça l'amuse…
[^] # Re: Les arguments
Posté par delio . Évalué à 4.
Ça n'est pas un hack, on peut mettre ce qu'on veut dans le argv[0] en argument de execve(). Le fait d'y mettre le nom du programme est juste une convention qui est plus ou mois respectée, mais il y a des exceptions par exemple pour conditionner le fonctionnement d'un programme. Par exemple si on met un tiret avant le nom du shell dans argv[0] il se comporte differemment. ("A login shell is one whose first character of argument zero is a -, or one started with the --login option.")
Il y a aussi des situations réelles comme le shebang où le nom du programme tel qu'appelé ne se retrouve pas en argv[0] mais en argv[1]:
Bizarrement, bash cache ce mecanisme dans les scripts:
[^] # Re: Les arguments
Posté par totof2000 . Évalué à 4.
Pour moi le programme appelant est le programme qui lance le programme. : dans une session interactive, le programme appelant sera le shell (bash, sh, csh selon les préférences). Peut-être n'est-ce pas ce que tu as voulu dire, mais c'est ce que j'ai compris à ta lecture.
Et dans le texte que je cite, je traduis " is the name by which the program was called" par "est le nom par lequel le programme a été appelé." ce qui est différent du "nom de l'appelant" …
Je ne t'apprendrais rien, mais pour ceux qui ne savent pas, c'est une astuce qui permet d'avoir un même exécutable qui effectuera des choses plus ou moins différentes en fonction du nom par lequel on l'a appelé (busybox fonctionne comme ça : plein de liens sur le même exécutable).
[^] # Re: Les arguments
Posté par calandoa . Évalué à 4.
Quelle mauvaise foi ! Si Tatie Josianne compose ton numéro de téléphone, qu'il se mette à sonner, que ton tympan actionne ton étrier qui actionne ton limaçon qui envoie des signaux électriques dans le nerf vestibulaire à ton cerveau, c'est donc toi qui appelle du fait que Tatie elle a pas branlé grand chose par rapport à tout le bordel qui s'est déroulé dans ton oreille interne.
# Makefile
Posté par Mais qui suis-je ? :) . Évalué à 1.
Pour te simplifier la vie, écrit un Makefile, c'est un fichier qui contiens les règles de compilation et automatise la procédure, c'est un peu complexes lorsqu'on débute, mais c'est pratique des que tu veux compiler plusieurs fichiers ensembles, ainsi au lieu de tapper gcc etc…
Tu te contentes de taper
make
En bonus si c'est un projet scolaire c'est classe,
une fois que tu as compris make, tu utiliseras des outils qui te machent le travail genre cmake
Pour make tu trouveras par exemple un tuto par là
http://www.siteduzero.com/informatique/tutoriels/compilez-sous-gnu-linux/la-commande-make-et-le-fichier-makefile-presentation
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.