Langage C
l'étudier c'est l'adopter
Ecrire dans un fichier en C
Commencer une experience dans la programmation est un travail très
rigoureux et intelectuellement très enrichissant. Pour s'ouvrir
en général à la programmation, on commence par
apprendre la logique de programmation appelée communément
l'algorithmie, l'étude d'algorithme est une des bases
fondamentales pour comprendre n'importe quel langage, le plus
important est votre logique et vos idées créatrices sur
un projet de logiciel libre, le langage n'est qu'un support en
fonction de la tâche que vous vous êtes donnée. Par
exemple la création d'un IDS (Intrusion Dectection System) tel
que Snort ou Prelude sera beaucoup plus adapté à un
langage comme le C, par contre un editeur de texte ou une suite
bureautique se verra plus facilement développée en C++.
Le langage C est un langage système, il touche au noyau,
drivers, et outils d'administrations, la sécurité,
les réseaux. L'histoire du C à déjà été
plusieurs fois cité sur casiment toutes les documentations de
présentations du langage et je pense que si vous lisez ces
quelques lignes c'est que ce n'est pas votre première lecture
d'un tutoriel d'étude et de présentation du C donc vous
êtes surment déjà au courrant de l'histoire, dans
le cas contraire je me félicite d'etre votre premier texte sur
le sujet :-) et dans votre grande croisade de programmeur en herbe,
vous pourrez par internet savoir comment à été
crée le langage C.
Ce tutoriel va vous apprendre à travers mes expliquations
qui je l'espère resterons l'impides à votre reflexion,
un programme qui va demander un nom de fichier sur la ligne de
commande ouvrir en écriture ce fichier dans le répertoire
courrant et demander à l'utilisateur de saisir des caractères
qui seront enregistrés dans ce fichier pour ensuite être
fermé puis à nouveau ouvert, afin de permettre au
programme de lire son contenue et l'afficher à l'ecran.
Commençons en pençant logique de programmation avant
d'attaquer le code lui même :
Son nom sera programme1.c, l'editeur texte est choisi en fonction
de votre gout.
programme1.c se décompose comment ?
1 - En première partie la déclaration des fichiers
en-tête qui vont nous servir à utliser toutes fonctions
nécessaires au programme.
2 - Ensuite notre fonction main() qui devra avoir comme
paramètres les variables qui vons nous permettre de détecter
les arguments passés sur la ligne de commande.
3 - Les variables qui vont nous servir par exemple pour pointer
sur le fichier à ouvrir mais aussi pour l'utilisation
ulterieur de boucle for, généralement ont utilise une
variable de boucle nommée ''i'', ainci qu'une variable qui
devra nous servir à saisir les noms entrés par
l'utilisateur nommée ''nom''.
4 - L'ouverture du fichier en écriture.
5 – Un boucle for pour la saisie des noms, puis l'écriture dans
le fichier qui aura la structure suivante :
Pour un compteur partant de 0 jusqu'à 5 faire
Afficher à l'utilisateur le message : "Entrez un nom :"
Enregistrer nom dans variable nom;
Ecrire le contenu de la variable dans le fichier
Vider le buffer qui a servis à la saisie du nom pour entrer le prochain nom
Fin de la boucle
6 – Fermeture du fichier
7 – Réouverture du fichier en lecture seul.
8 – Une boucle For qui va afficher le contenu du fichier
9 – Fermeture du fichier et sortie du programme.
programme1.c à besoin de quoi ?
En fichier en-tete nous aurons besoins de stdio.h et stdlib.h
Connaître le nombre d'argument sur la ligne de commande, ce
qui veus dire que nous allons utiliser la variable "argc" qui
stocke le nombres d'arguments sur la ligne de commande, c'est une
variable de type INT et la variable "argv[]" qui est un tableau de type CHAR
regroupant les divers arguments passés sur la ligne.
La variable i pour nos boucles for, une variable nommée
"nom" de type char d'une longeur de 20 octets qui contiendra les
noms saisies.
Une structure de type FILE décrivant le fichier à
ouvrir avec un poiteur nomé "f" pour pointer sur le fichier à
ouvrir/ecrire.
Maintenant que nous avons nos éléments de bases pour
le programme, que nous savons dans quel ordre il faut prosseder pour
effectuer toutes les tâches, il faut écrire le code.
Dans votre éditeur de texte favoris commençez par
écrire les fichiers en-têtes nécessaires.
#include < stdio.h >
#include < stdlib.h > /*Pour exit()*/
int main(int argc, char *argv[]) { /*nos 2 paramètres argc et argv pour lire la
ligne de commande*/
FILE *f; /*Notre
pointeur f pour pointer sur le fichier d'ou son nom f*/
int i; /*La variable i à utiliser pour nos futurs boucles
for*/
char nom[20]; /*La variable qui va stocker les noms saisies par
l'utilisateur */
/*Testons le nombre d'argument passé sur la ligne de
commande, si il est inferieur à 2 afficher un message d'utilisation du programme et
quitter le programme*/
if (argc<2) {
printf("Usage : %s "; argv[0]");
exit(EXIT_SUCCESS);
}
A ce stade le programme peu reconnaître le nombre
d'argument passé en paramètre sur la ligne de
commande.
que signifie ce argv[0] pourquoi 0 ?
Comme je l'ai dis plus
haut "argv" est un tableau qui contient le nombre d'argument passé
en paramètre au programme, mais le nom du programme est aussi
un paramètre et il est et sera toujours stocké en
première position à l'emplacement 0 du tableau.
Pour ouvrir le fichier, nous allons utiliser la fonction "fopen" de
la bibliothèque des entrées/sorties standards (ie.
Stdio.h) fopen prend differents paramêtres pour fonctionner :
fopen(''nom_du_fichier'', ''mode'');
nom_du_fichier est à remplacer par une variable
de type char qu contient le nom du fichier à ouvrir, dans le
cas ou le fichier n'existe pas il sera automatiquement crée.
''Mode'' indique le type d'ouverture à effectuer sur le
fichier voici la liste des differents modes disponibles avec les
quels ont travail :
"r" = (
Pour read) Ouvre le fichier en mode lecture seule.
"w" = (
Pour write)Ouvre le fichier en écriture,
si il n'existe pas il le crée avec une taille de 0 octect
"r+" = Ouvre le fichier en lecture/écriture.
Pour vous donner le structure type de la fonction open dans le
terme normale en C :
fopen(char *path, char *mode);
Continuons le programme :
f = fopen('argv[1], "w");
for (i=0;i<5;i++) {
printf("Entrez un nom : ");
if (fgets(nom, sizeof(nom), stdin) != NULL ) {
fprintf(f, "%s", nom); }
else {
fprintf(stderr, "Erreur d'enregistrement du nom dans le fichier");
exit(EXIT_FAILURE);
}
fflush(stdin);
}
fclose(f);
Les lignes suivantes sont clairements simples à comprendre.
Comme il a été dit plus haut "fopen" ouvre le fichier
contenu dans la variable char "argv" à l'emplacement 1 du
tableau en écriture, ensuite on lance une boucle qui se
finira quand i sera égale à 5, dans cette boucle on
affiche un mesage à l'utilisateur lui demandant de saisir un
nom, grâce à "fgets", pour comprendre "fgets" voici sa
structure simplifiée :
caractère de retour
fgets(variable_qui_contient_le_nom_saisie, buffer_de_la_variable,
flux_à_lire);
en C :
char * fgets(char *str, int size, FILE *stream);
La variable qui va contenir le nom saisie est bien "nom", on
test la valeur de retour de fgets si differents de NULL tout se passe
bien sinon affichage du message d'erreur. Pour revenir à la
structure de fgets il y a un "sizeof" qui est une fonction qui renvoie
la taille de la variable précisée entre les paranthèses
ici sizeof(nom), et cela se termine sur le flux à lire
"stdin" qui est l'expression de l'entrée standard (le
clavier) "fgets" renvoie un type d'erreur de type char d'ou le char *
devant fgets.
Puis viens l'etape d'enregistrement de la saisie utilisateur dans
le fichier, avec la fonction "fprintf" qui a la strucuture
simplifiée suivante :
entier en retour fprintf(destination, ''source'')
Ou la strucuture en C :
int fprintf(FILE *stream, const char *format)
A ce stade notre programme est capable d'ouvrir un fichier
d'ecrire dans ce fichier et de fermer ce fichier.
Il s'agit maintenant de réouvrir ce fichier et lire son
contenu pour l'afficher à l'écran, puis quitter
proprement le programme.
f = fopen(argv[1], "r");
while (fgets(nom, sizeof(nom), f) != NULL) {
printf("%s", nom);
}
exit(EXIT_SUCCESS);
}
Maintenant vous connaissez le principe de "fopen", pas la peine de
revenir dessus à noté qu'ici on ouvre le fichier en
lecture seul ''r''. Pour la lecture du fichier, il faut utiliser une
boucle "while" avec un test de la valeur de retour de "fgets", chaque
ligne contenu dans le fichier sont une à une placée
dans la variable "nom" puis ensuite affichée à l'ecran.
Vous remarquerez qu'ici la boucle s'arrette quand fgets renvoie NULL
c'est à dire quand il ne peu plus rien lire, je n'ai pas
utilisé la valeur 5 pour la boucle c'était justement
voulu pour bien comprendre cette valeur de retour.
Le programme est terminé la compilation se veut très
simple à ce stade faite simplement :
$gcc –pipe -Wall programme1.c
L'option -Wall de gcc affiche le maximum de message, si il y
a un souci lors de la compilation.
Cette ligne va créer un fichier binaire appelé a.out
pourle lancer il vous suffit de faire :
$./a.out
Si ce petit article vous à plus et que vous en redemandez
voici un petit exercice :
Modifier le programme pour faire en sorte qu'il demande un nom de
fichier si aucun argument n'a été donné.
Modifier le programme pour que le nombre de personne à
enregistrer soit demandé à l'utilisateur, (un indice
vous aurez besoin de
strtol
ou
atoi
pour accomplir cette tâche, bonne chance).
L'article se termine, j'espère qu'il vous aura donné
satisfaction, si quelque chose vous échappe, l'hesitez pas à écrire un commentaire
afin de trouver réponse à vos questions.
Voir le code source complet et commenté :
Programme1.c
Quelques liens pour apprendre le C :
Article
de présentation du langage C
www-ipst.u-strasbg.fr
www.linux-kheops.com
fastnet.univ-brest.fr
Le
langage C, norme ANSI