Opérations sur les Fichiers en Langage C
Les fichires dans C sont conçus comme des flux de données, stockant des informations sous forme de séquences d'octets. Ils se divisent en deux catégories : les fichiers texte, qui enregistrent les caractères en code ASCII (chaque caractère occupant un octet), et les fichiers binaires, qui conservent la représentation interne des données, optimisant l'espace et la vitesse d'accès pour les valeurs numériques.
Un pointeur de fichier, déclaré par exemple FILE *streamPointer;, est essentiel pour gérer les opérations d'E/S. Ce pointeur référence une structure qui maintient l'état du fichier, incluant la position courante de lecture/écriture et des indicateurs de statut.
L'accès aux fichiers se fait via fopen, qui retourne un pointeur valide ou NULL en cas d'échec. Les modes courants incluent "r" (lecture), "w" (écriture, écrasant le contenu existant) et "a" (ajout en fin de fichier). La fonction fclose libère les ressources associées et assure la persistance des données, renvoyant 0 si elle réussit ou EOF sinon.
Pour la lecture et l'écriture, plusieurs focntions sont disponibles :
- Caractère par caractère :
fgetclit un caractère depuis le fichier, tandis quefputcen écrit un. - Cadenas de caractères :
fgetsextrait une chaîne de longueur limitée, etfputsécrit une chaîne dans le fichier. - Formatées :
fscanfetfprintfpermettent des opérations analogues àscanfetprintf, mais avec des flux de fichiers. - Blocs de données :
freadetfwritemanipulent des ensembles d'octets, adaptés aux structures ou tableaux.
La navigation dans un fichier repose sur la manipulation du pointeur de position. fseek déplace ce pointeur selon un décalage et une origine (SEEK_SET, SEEK_CUR, SEEK_END). ftell retourne la position courante en octets par rapport au début du fichier, et rewind réinitialise le pointeur au commencement.
Instructions de Prétraitement en Langage C
Le prétraitement s'exécute avant la compilation, traitant des directives commençant par # pour étendre les capacités du langage. Les macros sont définies avec #define. Par exemple, #define MATH_PI 3.14159 remplace toutes les occurrences de MATH_PI par la valeur numérique correspondante. Pour des macros paramétrées, comme #define FIND_MAX(val1, val2) ((val1) > (val2)? (val1) : (val2)), le remplacement textuel est effectué sans vérification de types, offrant une efficacité accrue mais un risque de duplication de code.
L'inclusion de fichiers, via #include, intègre le contenu d'un fichier source dans un autre. Les formes #include <nom_systeme> et #include "nom_utilisateur" spécifient les chemins de recherche respectifs, favorisant la réutilisation et la modularité du code.
La compilation conditionnelle permet d'inclure ou d'exclure des segments de code selon des conditions. Des directives comme #ifdef, #ifndef et #if contrôlent cette logique. Par exemple :
#ifdef MODE_DEBUG
printf("Information de débogage\n");
#endif
#define RELEASE_VERSION 2
#if RELEASE_VERSION == 1
// logique pour la version 1
#elif RELEASE_VERSION == 2
// logique pour la version 2
#else
// logique pour d'autres versions
#endif
Ces mécanismes facilitent le débogage, la portabilité et la génération de variantes d'applications.