Gestion des fichiers C
Gestion des fichiers C
Dans ce tutoriel, vous apprendrez la gestion des fichiers en C. Vous apprendrez à gérer les E/S standard en C en utilisant fprintf(), fscanf(), fread(), fwrite(), fseek() etc. avec l'aide de exemples.
Un fichier est un conteneur dans les périphériques de stockage informatique utilisé pour stocker des données.
Pourquoi les fichiers sont-ils nécessaires ?
- Lorsqu'un programme est terminé, toutes les données sont perdues. Le stockage dans un fichier préservera vos données même si le programme se termine.
- Si vous devez saisir un grand nombre de données, cela prendra beaucoup de temps pour toutes les saisir.
Cependant, si vous avez un fichier contenant toutes les données, vous pouvez facilement accéder au contenu du fichier en utilisant quelques commandes en C. - Vous pouvez facilement déplacer vos données d'un ordinateur à un autre sans aucune modification.
Types de fichiers
Lorsque vous traitez des fichiers, il existe deux types de fichiers que vous devez connaître :
- Fichiers texte
- Fichiers binaires
1. Fichiers texte
Les fichiers texte sont les .txt normaux des dossiers. Vous pouvez facilement créer des fichiers texte à l'aide de n'importe quel éditeur de texte simple tel que le Bloc-notes.
Lorsque vous ouvrez ces fichiers, vous verrez tout le contenu du fichier sous forme de texte brut. Vous pouvez facilement modifier ou supprimer le contenu.
Ils nécessitent un minimum d'efforts pour être entretenus, sont facilement lisibles, offrent le moins de sécurité et occupent un espace de stockage plus important.
2. Fichiers binaires
Les fichiers binaires sont principalement le .bin fichiers sur votre ordinateur.
Au lieu de stocker les données en texte brut, ils les stockent sous forme binaire (0 et 1).
Ils peuvent contenir une plus grande quantité de données, ne sont pas lisibles facilement et offrent une meilleure sécurité que les fichiers texte.
Opérations sur les fichiers
En C, vous pouvez effectuer quatre opérations majeures sur les fichiers, qu'ils soient texte ou binaire :
- Création d'un nouveau fichier
- Ouvrir un fichier existant
- Fermer un fichier
- Lire et écrire des informations dans un fichier
Travailler avec des fichiers
Lorsque vous travaillez avec des fichiers, vous devez déclarer un pointeur de type file. Cette déclaration est nécessaire pour la communication entre le fichier et le programme.
FILE *fptr;
Ouverture d'un fichier - pour création et modification
L'ouverture d'un fichier s'effectue à l'aide du fopen()
fonction définie dans le stdio.h
fichier d'en-tête.
La syntaxe pour ouvrir un fichier en E/S standard est :
ptr = fopen("fileopen","mode");
Par exemple,
fopen("E:\\cprogram\\newprogram.txt","w");
fopen("E:\\cprogram\\oldprogram.bin","rb");
- Supposons le fichier
newprogram.txt
n'existe pas à l'emplacementE:\cprogram
. La première fonction crée un nouveau fichier nomménewprogram.txt
et l'ouvre pour l'écriture selon le mode 'w' .
Le mode écriture vous permet de créer et de modifier (écraser) le contenu du fichier. - Supposons maintenant le deuxième fichier binaire
oldprogram.bin
existe à l'emplacementE:\cprogram
. La seconde fonction ouvre le fichier existant en lecture en mode binaire 'rb' .
Le mode lecture vous permet uniquement de lire le fichier, vous ne pouvez pas écrire dans le fichier.
Mode | Signification du mode | Pendant l'inexistence du fichier |
---|---|---|
r | Ouvert pour lecture. | Si le fichier n'existe pas, fopen() renvoie NULL. |
rb | Ouvert en lecture en mode binaire. | Si le fichier n'existe pas, fopen() renvoie NULL. |
w | Ouvert pour l'écriture. | Si le fichier existe, son contenu est écrasé. Si le fichier n'existe pas, il sera créé. |
wb | Ouvert pour l'écriture en mode binaire. | Si le fichier existe, son contenu est écrasé. Si le fichier n'existe pas, il sera créé. |
a | Ouvert pour ajout. Les données sont ajoutées à la fin du fichier. | Si le fichier n'existe pas, il sera créé. |
ab | Ouvrir pour ajouter en mode binaire. Les données sont ajoutées à la fin du fichier. | Si le fichier n'existe pas, il sera créé. |
r+ | Ouvert pour la lecture et l'écriture. | Si le fichier n'existe pas, fopen() renvoie NULL. |
rb+ | Ouvert pour la lecture et l'écriture en mode binaire. | Si le fichier n'existe pas, fopen() renvoie NULL. |
w+ | Ouvert pour la lecture et l'écriture. | Si le fichier existe, son contenu est écrasé. Si le fichier n'existe pas, il sera créé. |
wb+ | Ouvert pour la lecture et l'écriture en mode binaire. | Si le fichier existe, son contenu est écrasé. Si le fichier n'existe pas, il sera créé. |
a+ | Ouvert pour la lecture et l'ajout. | Si le fichier n'existe pas, il sera créé. |
ab+ | Ouvert pour la lecture et l'ajout en mode binaire. | Si le fichier n'existe pas, il sera créé. |
Fermer un fichier
Le fichier (texte et binaire) doit être fermé après lecture/écriture.
La fermeture d'un fichier s'effectue à l'aide du fclose()
fonction.
fclose(fptr);
Ici, fptr
est un pointeur de fichier associé au fichier à fermer.
Lire et écrire dans un fichier texte
Pour lire et écrire dans un fichier texte, nous utilisons les fonctions fprintf()
et fscanf().
Ce ne sont que les versions de fichier de printf()
et scanf()
. La seule différence est que fprintf()
et fscanf()
attend un pointeur vers la structure FILE.
Exemple 1 :Écrire dans un fichier texte
#include <stdio.h>
#include <stdlib.h>
int main()
{
int num;
FILE *fptr;
// use appropriate location if you are using MacOS or Linux
fptr = fopen("C:\\program.txt","w");
if(fptr == NULL)
{
printf("Error!");
exit(1);
}
printf("Enter num: ");
scanf("%d",&num);
fprintf(fptr,"%d",num);
fclose(fptr);
return 0;
}
Ce programme prend un numéro de l'utilisateur et le stocke dans le fichier program.txt
.
Après avoir compilé et exécuté ce programme, vous pouvez voir un fichier texte program.txt
créé dans le lecteur C de votre ordinateur. Lorsque vous ouvrez le fichier, vous pouvez voir le nombre entier que vous avez saisi.
Exemple 2 :Lire à partir d'un fichier texte
#include <stdio.h>
#include <stdlib.h>
int main()
{
int num;
FILE *fptr;
if ((fptr = fopen("C:\\program.txt","r")) == NULL){
printf("Error! opening file");
// Program exits if the file pointer returns NULL.
exit(1);
}
fscanf(fptr,"%d", &num);
printf("Value of n=%d", num);
fclose(fptr);
return 0;
}
Ce programme lit l'entier présent dans le program.txt
fichier et l'imprime à l'écran.
Si vous avez réussi à créer le fichier de l'Exemple 1 , l'exécution de ce programme vous donnera le nombre entier que vous avez entré.
Autres fonctions comme fgetchar()
, fputc()
etc. peuvent être utilisés de la même manière.
Lecture et écriture dans un fichier binaire
Fonctions fread()
et fwrite()
sont utilisés pour lire et écrire dans un fichier sur le disque respectivement dans le cas de fichiers binaires.
Écrire dans un fichier binaire
Pour écrire dans un fichier binaire, vous devez utiliser le fwrite()
fonction. Les fonctions prennent quatre arguments :
- adresse des données à écrire sur le disque
- taille des données à écrire sur le disque
- nombre de ce type de données
- pointeur vers le fichier où vous voulez écrire.
fwrite(addressData, sizeData, numbersData, pointerToFile);
Exemple 3 :Écrire dans un fichier binaire à l'aide de fwrite()
#include <stdio.h>
#include <stdlib.h>
struct threeNum
{
int n1, n2, n3;
};
int main()
{
int n;
struct threeNum num;
FILE *fptr;
if ((fptr = fopen("C:\\program.bin","wb")) == NULL){
printf("Error! opening file");
// Program exits if the file pointer returns NULL.
exit(1);
}
for(n = 1; n < 5; ++n)
{
num.n1 = n;
num.n2 = 5*n;
num.n3 = 5*n + 1;
fwrite(&num, sizeof(struct threeNum), 1, fptr);
}
fclose(fptr);
return 0;
}
Dans ce programme, nous créons un nouveau fichier program.bin
dans le lecteur C.
On déclare une structure threeNum
avec trois nombres - n1, n2 et n3 , et définissez-le dans la fonction principale comme num.
Maintenant, à l'intérieur de la boucle for, nous stockons la valeur dans le fichier en utilisant fwrite()
.
Le premier paramètre prend l'adresse de num et le deuxième paramètre prend la taille de la structure threeNum
.
Puisque nous n'insérons qu'une seule instance de num , le troisième paramètre est 1
. Et, le dernier paramètre *fptr
pointe vers le fichier dans lequel nous stockons les données.
Enfin, nous fermons le fichier.
Lecture depuis un fichier binaire
Fonction fread()
prend également 4 arguments similaires au fwrite()
fonctionner comme ci-dessus.
fread(addressData, sizeData, numbersData, pointerToFile);
Exemple 4 :Lire à partir d'un fichier binaire à l'aide de fread()
#include <stdio.h>
#include <stdlib.h>
struct threeNum
{
int n1, n2, n3;
};
int main()
{
int n;
struct threeNum num;
FILE *fptr;
if ((fptr = fopen("C:\\program.bin","rb")) == NULL){
printf("Error! opening file");
// Program exits if the file pointer returns NULL.
exit(1);
}
for(n = 1; n < 5; ++n)
{
fread(&num, sizeof(struct threeNum), 1, fptr);
printf("n1: %d\tn2: %d\tn3: %d\n", num.n1, num.n2, num.n3);
}
fclose(fptr);
return 0;
}
Dans ce programme, vous lisez le même fichier program.bin
et parcourir les enregistrements un par un.
En termes simples, vous lisez un threeNum
enregistrement de threeNum
taille du fichier pointé par *fptr dans la structure num .
Vous obtiendrez les mêmes enregistrements que vous avez insérés dans Exemple 3 .
Obtenir des données à l'aide de fseek()
Si vous avez de nombreux enregistrements dans un fichier et que vous avez besoin d'accéder à un enregistrement à une position spécifique, vous devez parcourir tous les enregistrements avant pour obtenir l'enregistrement.
Cela gaspillera beaucoup de mémoire et de temps de fonctionnement. Un moyen plus simple d'accéder aux données requises peut être obtenu en utilisant fseek()
.
Comme son nom l'indique, fseek()
recherche le curseur sur l'enregistrement donné dans le fichier.
Syntaxe de fseek()
fseek(FILE * stream, long int offset, int whence);
Le premier flux de paramètres est le pointeur vers le fichier. Le deuxième paramètre est la position de l'enregistrement à rechercher et le troisième paramètre spécifie l'emplacement où commence le décalage.
D'où | Signification |
---|---|
SEEK_SET | Commence le décalage depuis le début du fichier. |
SEEK_END | Commence le décalage à partir de la fin du fichier. |
SEEK_CUR | Démarre le décalage à partir de l'emplacement actuel du curseur dans le fichier. |
Exemple 5 :fseek()
#include <stdio.h>
#include <stdlib.h>
struct threeNum
{
int n1, n2, n3;
};
int main()
{
int n;
struct threeNum num;
FILE *fptr;
if ((fptr = fopen("C:\\program.bin","rb")) == NULL){
printf("Error! opening file");
// Program exits if the file pointer returns NULL.
exit(1);
}
// Moves the cursor to the end of the file
fseek(fptr, -sizeof(struct threeNum), SEEK_END);
for(n = 1; n < 5; ++n)
{
fread(&num, sizeof(struct threeNum), 1, fptr);
printf("n1: %d\tn2: %d\tn3: %d\n", num.n1, num.n2, num.n3);
fseek(fptr, -2*sizeof(struct threeNum), SEEK_CUR);
}
fclose(fptr);
return 0;
}
Ce programme commencera à lire les enregistrements du fichier program.bin
dans l'ordre inverse (du dernier au premier) et l'imprime.
Langue C