C - E / S fichier

Le dernier chapitre expliquait les périphériques d'entrée et de sortie standard gérés par le langage de programmation C. Ce chapitre explique comment les programmeurs C peuvent créer, ouvrir, fermer des fichiers texte ou binaires pour leur stockage de données.

Un fichier représente une séquence d'octets, qu'il s'agisse d'un fichier texte ou d'un fichier binaire. Le langage de programmation C permet d'accéder aux fonctions de haut niveau ainsi qu'aux appels de bas niveau (niveau OS) pour gérer les fichiers sur vos périphériques de stockage. Ce chapitre vous présente les appels importants à la gestion des fichiers.

Ouverture de fichiers

Vous pouvez utiliser le fopen( )fonction pour créer un nouveau fichier ou pour ouvrir un fichier existant. Cet appel initialisera un objet du typeFILE, qui contient toutes les informations nécessaires pour contrôler le flux. Le prototype de cet appel de fonction est le suivant -

FILE *fopen( const char * filename, const char * mode );

Ici, filename est une chaîne littérale, que vous utiliserez pour nommer votre fichier et accéder mode peut avoir l'une des valeurs suivantes -

N ° Sr. Mode et description
1

r

Ouvre un fichier texte existant à des fins de lecture.

2

w

Ouvre un fichier texte pour l'écriture. S'il n'existe pas, un nouveau fichier est créé. Ici, votre programme commencera à écrire du contenu depuis le début du fichier.

3

a

Ouvre un fichier texte pour l'écriture en mode ajout. S'il n'existe pas, un nouveau fichier est créé. Ici, votre programme commencera à ajouter du contenu dans le contenu du fichier existant.

4

r+

Ouvre un fichier texte pour la lecture et l'écriture.

5

w+

Ouvre un fichier texte pour la lecture et l'écriture. Il tronque d'abord le fichier à une longueur nulle s'il existe, sinon crée un fichier s'il n'existe pas.

6

a+

Ouvre un fichier texte pour la lecture et l'écriture. Il crée le fichier s'il n'existe pas. La lecture commencera par le début mais l'écriture ne peut être ajoutée.

Si vous comptez gérer des fichiers binaires, vous utiliserez les modes d'accès suivants au lieu de ceux mentionnés ci-dessus -

"rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"

Fermer un fichier

Pour fermer un fichier, utilisez la fonction fclose (). Le prototype de cette fonction est -

int fclose( FILE *fp );

le fclose(-) la fonction renvoie zéro en cas de succès, ou EOFs'il y a une erreur lors de la fermeture du fichier. Cette fonction vide en fait toutes les données encore en attente dans la mémoire tampon du fichier, ferme le fichier et libère toute mémoire utilisée pour le fichier. L'EOF est une constante définie dans le fichier d'en-têtestdio.h.

Il existe diverses fonctions fournies par la bibliothèque standard C pour lire et écrire un fichier, caractère par caractère, ou sous la forme d'une chaîne de longueur fixe.

Ecrire un fichier

Voici la fonction la plus simple pour écrire des caractères individuels dans un flux -

int fputc( int c, FILE *fp );

La fonction fputc()écrit la valeur de caractère de l'argument c dans le flux de sortie référencé par fp. Il renvoie le caractère écrit écrit en cas de succès sinonEOFs'il y a une erreur. Vous pouvez utiliser les fonctions suivantes pour écrire une chaîne terminée par null dans un flux -

int fputs( const char *s, FILE *fp );

La fonction fputs() écrit la chaîne sau flux de sortie référencé par fp. Il renvoie une valeur non négative en cas de succès, sinonEOFest renvoyé en cas d'erreur. Vous pouvez utiliserint fprintf(FILE *fp,const char *format, ...)aussi bien pour écrire une chaîne dans un fichier. Essayez l'exemple suivant.

Assurez-vous que vous avez /tmprépertoire disponible. Si ce n'est pas le cas, avant de continuer, vous devez créer ce répertoire sur votre machine.

#include <stdio.h>

main() {
   FILE *fp;

   fp = fopen("/tmp/test.txt", "w+");
   fprintf(fp, "This is testing for fprintf...\n");
   fputs("This is testing for fputs...\n", fp);
   fclose(fp);
}

Lorsque le code ci-dessus est compilé et exécuté, il crée un nouveau fichier test.txtdans le répertoire / tmp et écrit deux lignes en utilisant deux fonctions différentes. Lisons ce fichier dans la section suivante.

Lire un fichier

Ci-dessous, la fonction la plus simple pour lire un seul caractère dans un fichier -

int fgetc( FILE * fp );

le fgetc()La fonction lit un caractère dans le fichier d'entrée référencé par fp. La valeur de retour est le caractère lu, ou en cas d'erreur, elle renvoieEOF. La fonction suivante permet de lire une chaîne à partir d'un flux -

char *fgets( char *buf, int n, FILE *fp );

Les fonctions fgets()lit jusqu'à n-1 caractères dans le flux d'entrée référencé par fp. Il copie la chaîne de lecture dans le tamponbuf, en ajoutant un null caractère pour terminer la chaîne.

Si cette fonction rencontre un caractère de nouvelle ligne '\ n' ou la fin du fichier EOF avant qu'ils n'aient lu le nombre maximum de caractères, alors elle ne renvoie que les caractères lus jusqu'à ce point, y compris le caractère de nouvelle ligne. Vous pouvez aussi utiliserint fscanf(FILE *fp, const char *format, ...) pour lire les chaînes d'un fichier, mais il arrête la lecture après avoir rencontré le premier caractère d'espace.

#include <stdio.h>

main() {

   FILE *fp;
   char buff[255];

   fp = fopen("/tmp/test.txt", "r");
   fscanf(fp, "%s", buff);
   printf("1 : %s\n", buff );

   fgets(buff, 255, (FILE*)fp);
   printf("2: %s\n", buff );
   
   fgets(buff, 255, (FILE*)fp);
   printf("3: %s\n", buff );
   fclose(fp);

}

Lorsque le code ci-dessus est compilé et exécuté, il lit le fichier créé dans la section précédente et produit le résultat suivant -

1 : This
2: is testing for fprintf...

3: This is testing for fputs...

Voyons un peu plus en détail ce qui s'est passé ici. Première,fscanf() lire juste This car après cela, il a rencontré un espace, le deuxième appel est pour fgets()qui lit la ligne restante jusqu'à ce qu'elle rencontre la fin de la ligne. Enfin, le dernier appelfgets() lit complètement la deuxième ligne.

Fonctions d'E / S binaires

Deux fonctions peuvent être utilisées pour l'entrée et la sortie binaires -

size_t fread(void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);
              
size_t fwrite(const void *ptr, size_t size_of_elements, size_t number_of_elements, FILE *a_file);

Ces deux fonctions doivent être utilisées pour lire ou écrire des blocs de mémoires - généralement des tableaux ou des structures.