Passer des arguments en console
Note : Sous Windows et Linux, la démarche à suivre est la même hormis pour l'ouverture de la console.
Supposons que mon programme soit dans le répertoire suivant :
C:\mon_super_programme\mon_super_programme.exe
Tout d'abord, ouvrez une console
(Démarrer > Exécuter > tapez "cmd" sous Windows).
Ensuite, placez-vous à la racine du disque dur ou de la partition où se trouve votre programme (C: sous Windows, généralement) en tapant simplement sa lettre :
Code : Console
Ensuite, vous devez indiquer le chemin relatif du dossier où se situe votre programme par rapport à la racine du disque sur lequel vous êtes précédé de la commande "cd") comme ceci :
Code : Console
Enfin, vous devez indiquer le nom de votre exécutable suivi des paramètres que vous voulez :
Code : Console | mon_super_programme.exe coucou test toto |
Chaque mot après le nom du programme sera placé dans une chaîne de caractères à laquelle vous pourrez accéder grâce à
argv.
Ainsi, dans mon exemple, on aura :
- dans argv[0] : mon_super_programme.exe (oui, souvenez-vous, je vous ai dit que par convention, le chemin du programme était indiqué dans argv[0]
)
- dans argv[1] : coucou
- dans argv[2] : test
- dans argv[3] : toto
Ainsi, on pourra facilement récupérer ces arguments dans notre programme en C.
C'est d'ailleurs ce qu'on va faire avec un petit exercice

.
Exercice d'application
Le but de cet exercice sera de vous familiariser à la gestion de
argc et
argv. Le principe est simple : afficher dans notre programme les arguments qui lui ont été passés par la console.
Essayez de le faire vous-même puis regardez cette correction :
Code : C 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 | #include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
int i;
for (i=0; i < argc; i++)
{
printf("Argument %ld : %s \n", i+1, argv[i]);
}
getchar();
return EXIT_SUCCESS;
}
|
Notez que j'indique dans
printf "i+1" pour le numéro du paramètre car i commence à 0 dans ma boucle.
Une fois lancé en console en suivant la démarche de tout à l'heure, vous devriez voir quelque chose comme ça :
Code : Console | C:\mon_super_programme>mon_super_programme.exe coucou test toto
Argument 1 : mon_super_programme.exe
Argument 2 : coucou
Argument 3 : test
Argument 4 : toto |
Pourquoi le chemin du programme est juste "console.exe" ?
En fait, c'est parce que le programme a été lancé depuis la console : comme je vous l'ai dit, argv[0] pointe en réalité sur la commande envoyée en console pour exécuter votre programme. En l'occurence, nous avons seulement tapé "mon_super_programme.exe" pour exécuter le programme donc argv[0] ne contient que "mon_super_programme.exe"

.
Cependant, lorsque votre programme est lancé à travers une interface graphique (en cliquant sur son icône), argv[0] contiendra bien le chemin entier de votre programmme, et c'est justement ce que nous allons voir maitenant

.
L'association de fichiers
Bon, maintenant que vous connaissez le principe, je vais vous parler d'une fonctionnalité que l'on retrouve sous plusieurs systèmes d'exploitation, j'ai nommé :
L'association de fichiers.
Cette fonction vous permet d'associer un programme à un fichier de sorte que lorsque vous choisissez ce fichier, le programme approprié se lance et s'en sert.
Par exemple, vos fichiers musicaux (.mp3) sont probablement associés à un lecteur (Winamp, Windows Media Player, etc...) de sorte que lorsque vous double-cliquez sur un fichier MP3, le lecteur approprié se lance et joue ce fichier.
Eh bien figurez-vous qu'en C, le chemin absolu de ce fichier sera contenu dans
argv[1] 
(si aucune autre information n'est pasée à la fonction
main hormis le chemin du programme).
En effet, lorsque vous associez un fichier à un programme et que vous double-cliquez sur ce fichier, votre système d'exploitation va lancer le programme en question en lui envoyant comme paramètre le chemin du fichier.
Exercice d'application
De cette façon, vous pouvez créer des applications qui gèrent l'association de fichiers, tenez par exemple, essayez de faire un programme en console qui permettrait d'afficher le contenu d'un fichier .txt qui lui serait passé en paramètre (dans argv[1] donc) :
Code : C 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 | #include <stdio.h>
#include <stdlib.h>
int main (int argc, char *argv[])
{
FILE *fichier = NULL;
char caractere;
if (argc > 1)
{
fichier = fopen (argv[1], "r"); /* On ouvre le fichier dont le chemin est accessible via argv[1] */
}
if (fichier != NULL)
{
do
{
caractere = fgetc (fichier);
printf("%c", caractere);
} while (caractere != EOF);
}
else exit(EXIT_FAILURE);
getchar();
return EXIT_SUCCESS;
}
|
Dans ce code, notez que la condition
Code : C est d'autant plus importante que l'on ne sait pas si le chemin donné dans
argv[1] est bien celui d'un fichier texte (l'utilisateur peut associer un programme au type de fichier qu'il veut).
Tiens, justement, parlons-en de l'association de fichiers :
Associer un programme à un type de fichier
Sous Windows, pour associer un programme à vos fichiers .txt, compilez (sans l'exécuter) le programme que vous venez de réaliser puis faites un clic droit sur un fichier texte et allez dans "Propriétés".
Dans le champ "S'ouvre avec", cliquez sur le bouton "Modifier...".
Une fenêtre s'ouvre.
Cliquez sur "Parcourir" et choisissez votre programme. Cliquez alors sur OK et fermez la fenêtre des Propriétés.
Désormais, lorsque vous cliquerez sur vos fichiers texte, ils s'ouvriront dans votre programme.
Remarque importante : ce procédé fonctionne également quand vous faites un glissé-déplacé d'un fichier sur l'icône de votre programme ; le chemin absolu du fichier se trouvera également dans argv[1]

.
Plutôt sympa, non

?
Problème avec les arguments sous Windows
Ce passage traite d'un problème qui peut arriver le plus souvent lorsque vous créez votre propre extension sous Windows et que vous envoyez en paramètre à votre programme un fichier possédant cette extension.
Il arrive dans ce cas que le chemin du fichier que vous passez en paramètre soit incomplet.
Plus exactement, dès qu'un espace est présent dans son chemin (ex : C:/Mes fichiers/fichier.ext), le chemin sera alors "fragmenté" en deux morceaux à partir de l'espace : le premier morceau sera dans argv[1] et le second dans argv[2].
Pourquoi ?
Sans trop rentrer dans les détails, le problème vient du fait que l'extension du fichier que vous utilisez est mal paramétrée sous Windows. Il nous faudra donc appliquer une légère modification.
Allez dans
Démarrer -> Paramètres -> Panneau de Configuration -> Options des Dossiers -> onglet "Types de Fichiers".
Ici, vous aurez une liste des extensions connues par Windows.
Dans cette liste, cherchez votre extension, puis cliquez sur le bouton "Avancé".
Une liste d'actions devrait alors apparaître à votre écran. Choisissez "open" (action d'ouvrir le fichier en anglais) puis cliquez sur "Modifier...". Dans la nouvelle fenêtre, observez le champ "Application utilisée pour exécuter cette action". Vous devriez y voir le chemin de votre programme entre guillemets suivi d'un obscur
%1.
Vous devez alors remplacer ce
%1 par
"%1" avec des guillemets.
De cette façon le chemin complet de votre fichier sera passé dans argv[1].
Je sais que je vous ai donné peu d'explications sur ce point mais l'on touche au système de gestion des fichiers de Windows et ce n'est pas le sujet de ce tutoriel donc je préfère ne pas m'étendre dessus

.
Cependant, on n'en a pas fini avec l'association de fichiers : en effet, il y a un léger problème...
Rien de grave, lisez plutôt

.