routes-linux
Vous êtes ici : Ecrire dans un fichier

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

Forum routes-linux (en ligne)

Liens (en travaux)

Téléchargements (en travaux)


Légende liens

Lien interne : interne
Lien sortant : sortant
Lien téléchargement : téléchargement
Lien Anglophone : Anglophone











- [ Powered by Itseasy v0.3.7 | Thème : Light Blue par Vanquish ] -
Les informations ne sont données qu'à titre indicatif.
© routes-linux, tous droits réservés - Reproduction interdite.

Administrer Itseasy

[ Page générée en 0.00348 secondes | Compression gZip active ]
Poids XHTML : 18.22 ko (21.56 ko non compressé) - CSS : 5.05 ko
Eléments chargés : 11.21 ko