English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Dans ce tutoriel, vous apprendrez à gérer les fichiers en langage C. Vous apprendrez à utiliser fprintf(), fscanf(), fread(), fwrite(), fseek() et d'autres pour gérer les entrées/sorties standard en langage C à travers des exemples./O.
Les fichiers sont des conteneurs utilisés dans les dispositifs de stockage informatique pour stocker des données.
Lorsque le programme se termine, toutes les données seront perdues. Même si le programme se termine, les données stockées dans le fichier seront conservées.
Si vous devez entrer une grande quantité de données, cela prendra beaucoup de temps pour les saisir toutes.
Cependant, si vous avez un fichier contenant toutes les données, vous pouvez accéder facilement au contenu du fichier en utilisant certaines commandes en C.
Vous pouvez facilement déplacer des données d'un ordinateur à un autre sans需要进行任何更改。
Lors du traitement des fichiers, vous devriez comprendre deux types de fichiers :
fichiers texte
fichiers binaires
Les fichiers texte sont des.txtfichiers. Vous pouvez créer des fichiers texte en utilisant n'importe quel éditeur de texte simple (par exemple, Notepad).
Lorsque vous ouvrez ces fichiers, vous verrez tout le contenu du fichier sous forme de texte pur. Vous pouvez facilement éditer ou supprimer le contenu.
Ils sont faciles à lire, nécessitent le moins de maintenance, offrent la sécurité la moins élevée et occupent plus d'espace de stockage.
Les fichiers binaires sont principalement utilisés dans les.binfichier.
Ils ne stockent pas les données au format texte pur, mais au format binaire (0 et1) pour stocker des données.
Comparativement aux fichiers texte, ils peuvent容纳 plus de données, sont plus difficiles à lire et offrent une meilleure sécurité.
En C, vous pouvez effectuer quatre opérations principales sur les fichiers :
Créer un nouveau fichier
Ouvrir un fichier existant
Fermeture du fichier
Lire des informations et écrire des informations dans le fichier
Lors du traitement des fichiers, il est nécessaire de déclarer un pointeur de type de fichier. Cette déclaration est nécessaire pour la communication entre le fichier et le programme.
FILE *fptr;
L'utilisation de la fonction fopen() définie dans le fichier d'en-tête stdio.h pour ouvrir un fichier.
Dans l'interface standard I / La syntaxe pour ouvrir un fichier en O est :
ptr = fopen("fileopen","mode");
Par exemple,
fopen("E:\\cprogram\\newprogram.txt","w"); fopen("E:\\cprogram\\oldprogram.bin","rb");
Supposons que le fichier newprogram.txt n'existe pas dans le chemin E:\cprogram. La première fonction crée un nouveau fichier nommé newprogram.txt et selon'w'Ouvrir le fichier pour écrire en mode
Le mode écriture vous permet de créer et d'éditer (écraser) le contenu du fichier.
Supposons maintenant que le deuxième fichier binaire oldprogram.bin existe dans le chemin E:\cprogram. La deuxième fonction ouvre un fichier existant, en mode binaire'rb'Lecture.
Le mode lecture ne vous permet que de lire le fichier, sans pouvoir écrire dans le fichier.
Mode | Le sens du mode | Pendant que le fichier n'existe pas |
---|---|---|
r | En modeLectureModeOuvrir. | Si le fichier n'existe pas, fopen() renvoie NULL. |
rb | Ouvrir en mode binaire pour lire | Si le fichier n'existe pas, fopen() renvoie NULL. |
w | Ouvrir un fichier texte qui permet d'écrire dans le fichier | Ouvrir un fichier texte qui permet d'écrire dans le fichier. S'il n'existe pas, un nouveau fichier sera créé. Ici, votre programme écrira du contenu à partir du début du fichier. Si le fichier existe, il sera tronqué à la longueur zéro et réécrit. |
wb | Ouvrir le fichier pour écrire en mode binaire | Si le fichier existe, son contenu sera écrasé. Si le fichier n'existe pas, il sera créé. |
a | Ouvrir pour ajouter Les données sont ajoutées à la fin du fichier. | Si le fichier n'existe pas, il sera créé. |
ab | Ouvrir en mode binaire pour ajouter Les données sont ajoutées à la fin du fichier. | Si le fichier n'existe pas, il sera créé. |
r+ | Ouvrir pour lecture et écriture | Si le fichier n'existe pas, fopen() renvoie NULL. |
rb+ | Ouvrir en mode binaire pour lire et écrire | Si le fichier n'existe pas, fopen() renvoie NULL. |
w+ | Ouvrir un fichier texte qui permet de lire et écrire le fichier | Si le fichier existe, son contenu sera écrasé. Si le fichier n'existe pas, il sera créé. |
wb+ | Ouvrir en mode binaire pour lire et écrire | Si le fichier existe, son contenu sera écrasé. Si le fichier n'existe pas, il sera créé. |
a+ | Ouvrir pour lire et ajouter | Si le fichier n'existe pas, il sera créé. |
ab+ | Ouvrir en mode binaire pour lire et ajouter | Si le fichier n'existe pas, il sera créé. |
Lecture/Après l'écriture, le fichier doit être fermé (fichier texte et fichier binaire).
La fonction fclose() peut fermer le fichier.
fclose(fptr);
Ici, fptr est le pointeur de fichier associé au fichier à fermer.
Pour lire et écrire des fichiers texte, nous utilisons les fonctions fprintf() et fscanf().
Ils ne sont que des versions de fichier de printf() et scanf(). La seule différence est que fprint() et fscanf() nécessitent un pointeur vers la structure FILE.
#include <stdio.h> #include <stdlib.h> int main() { int num; FILE *fptr; // Si vous utilisez MacOS ou Linux, veuillez utiliser le chemin correct 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 récupère 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 le fichier texte program.txt créé sur le lecteur C de l'ordinateur. Lorsque vous ouvrez le fichier, vous pouvez voir les entiers entrés.
#include <stdio.h> #include <stdlib.h> int main() { int num; FILE *fptr; if ((fptr = fopen("C:\\program.txt","r")) == NULL){ printf("Erreur ! Ouvrant le fichier"); //Si le pointeur de fichier retourne NULL, le programme se termine. exit(1); } fscanf(fptr,"%d", &num); printf("Value of n=%d", num); fclose(fptr); return 0; }
Ce programme lit les entiers existants dans le fichier program.txt et les affiche sur l'écran.
Si vous lisezExemple1Le fichier a été créé avec succès, exécutez ce programme pour obtenir les entiers entrés.
D'autres fonctions, telles que fgetchar(), fputc() et autres, peuvent être utilisées de la même manière.
Dans le cas des fichiers binaires, les fonctions fread() et fwrite() sont utilisées respectivement pour lire et écrire sur le disque.
Pour écrire dans un fichier binaire, il faut utiliser la fonction fwrite(). Ces fonctions prennent quatre paramètres :
L'adresse des données à écrire sur le disque
La taille des données à écrire sur le disque
Le nombre de tels données
Le pointeur vers le fichier à écrire.
fwrite(addressData, sizeData, numbersData, pointerToFile);
#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("Erreur ! Ouvrant le fichier"); // Si le pointeur de fichier retourne NULL, le programme se termine. 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 sur le lecteur C.
Nous déclarons trois nombres n1, n2et n3La structure threeNum, et la définissons dans la fonction principale sous le nom de num.
Maintenant, dans la boucle for, nous utilisons fwrite() pour stocker les valeurs dans le fichier.
Le premier paramètre accepte l'adresse de num, le deuxième paramètre accepte la taille de la structure threeNum.
Puisque nous insérons qu'un seul exemplaire de num, le troisième paramètre est1Le dernier paramètre* fptr pointe vers le fichier où nous devons stocker les données.
Enfin, nous fermons le fichier.
La fonction fread() utilise également des paramètres similaires à ceux de la fonction fwrite() précédemment mentionnée.4paramètres.
fread(addressData, sizeData, numbersData, pointerToFile);
#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("Erreur ! Ouvrant le fichier"); //Si le pointeur de fichier retourne NULL, le programme se termine. exit(1); } for(n = 1; n < 5; ++n); { fread(&num, sizeof(struct threeNum), 1, fptr); printf("\n"1: %d\t\n2: %d\t\n3: %d\", num.n1, num.n2, num.n3); } fclose(fptr); return 0; }
Dans ce programme, vous lisez le même fichier program.bin et parcourez les enregistrements individuellement en boucle.
En termes simples, vous obtiendrez* Lecture d'un threeNum de la taille de threeNum dans le fichier pointé par fptr*fptrnum enregistrer dans la structure num.
Vous obtiendrezExemple3DansEnregistrer des enregistrements identiques.
Si le fichier contient de nombreux enregistrements et qu'il faut accéder à un enregistrement spécifique, il faut parcourir tous les enregistrements pour obtenir cet enregistrement.
Cela gaspillerait beaucoup de mémoire et de temps d'opération. L'utilisation de fseek() peut obtenir les données nécessaires de manière simple.
Comme son nom l'indique, fseek() positionne le curseur sur le record donné dans le fichier.
fseek(FILE * stream, long int offset, int whence);
Le premier paramètre stream est un pointeur vers le fichier. Le deuxième paramètre est la position du record à trouver, et le troisième paramètre spécifie l'emplacement de départ de l'offset.
Position | Signification |
---|---|
SEEK_SET | Déplacer le curseur à partir du début du fichier. |
SEEK_END | Déplacer le curseur à partir de la fin du fichier. |
SEEK_CUR | Déplacer le curseur à partir de la position actuelle du curseur dans le fichier. |
#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("Erreur ! Ouvrant le fichier"); //Si le pointeur de fichier retourne NULL, le programme se termine. exit(1); } // Déplacer le curseur à la fin du fichier. fseek(fptr, -sizeof(struct threeNum), SEEK_END); for(n = 1; n < 5; ++n); { fread(&num, sizeof(struct threeNum), 1, fptr); printf("\n"1: %d\t\n2: %d\t\n3: %d\n", num.n1, num.n2, num.n3); fseek(fptr, -2*sizeof(struct threeNum), SEEK_CUR); } fclose(fptr); return 0; }
Ce programme commencera à lire et à imprimer les enregistrements du fichier program.bin dans un ordre inverse (de la dernière à la première).