E / S de fichiers C: ouverture, lecture, écriture et fermeture d'un fichier

Dans ce didacticiel, vous apprendrez à gérer les fichiers en C. Vous apprendrez à gérer les E / S standard en C en utilisant fprintf (), fscanf (), fread (), fwrite (), fseek () etc. à l'aide de exemples.

Un fichier est un conteneur dans les périphériques de stockage informatique utilisé pour stocker des données.

Pourquoi des fichiers sont-ils nécessaires?

  • Lorsqu'un programme est terminé, toutes les données sont perdues. Le stockage dans un fichier conservera vos données même si le programme se termine.
  • Si vous devez saisir un grand nombre de données, il faudra beaucoup de temps pour les saisir toutes.
    Cependant, si vous disposez d'un fichier contenant toutes les données, vous pouvez facilement accéder au contenu du fichier à l'aide de 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, vous devez connaître deux types de fichiers:

  1. Fichiers texte
  2. Fichiers binaires

1. Fichiers texte

Les fichiers texte sont les fichiers .txt normaux . 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 demandent un minimum d'effort à entretenir, sont facilement lisibles, offrent le moins de sécurité et prennent plus d'espace de stockage.

2. Fichiers binaires

Les fichiers binaires sont principalement les fichiers .bin de 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, texte ou binaire:

  1. Créer un nouveau fichier
  2. Ouvrir un fichier existant
  3. Fermer un dossier
  4. 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 la création et l'édition

L'ouverture d'un fichier est effectuée à l'aide de la fopen()fonction définie dans le stdio.hfichier d' en- tête.

La syntaxe pour ouvrir un fichier dans les E / S standard est:

 ptr = fopen("fileopen","mode"); 

Par exemple,

 fopen("E:\cprogram\newprogram.txt","w"); fopen("E:\cprogram\oldprogram.bin","rb");
  • Supposons que le fichier newprogram.txtn'existe pas à l'emplacement E:cprogram. La première fonction crée un nouveau fichier nommé newprogram.txtet l'ouvre pour l'écriture selon le mode «w» .
    Le mode d'écriture vous permet de créer et de modifier (écraser) le contenu du fichier.
  • Supposons maintenant que le deuxième fichier binaire oldprogram.binexiste à l'emplacement E:cprogram. La deuxième fonction ouvre le fichier existant pour la lecture en mode binaire «rb» .
    Le mode lecture vous permet uniquement de lire le fichier, vous ne pouvez pas écrire dans le fichier.
Modes d'ouverture dans les E / S standard
Mode Signification du mode Pendant l'inexistence du fichier
r Ouvert à la lecture. Si le fichier n'existe pas, fopen()renvoie NULL.
rb Ouvert pour la lecture en mode binaire. Si le fichier n'existe pas, fopen()renvoie NULL.
w Ouvert à 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 Ouvrir pour ajouter.
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 est effectuée à l'aide de la fclose()fonction.

 fclose(fptr);

Here, fptr is a file pointer associated with the file to be closed.

Reading and writing to a text file

For reading and writing to a text file, we use the functions fprintf() and fscanf().

They are just the file versions of printf() and scanf(). The only difference is that fprint() and fscanf() expects a pointer to the structure FILE.

Example 1: Write to a text file

 #include #include 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; ) 

This program takes a number from the user and stores in the file program.txt.

After you compile and run this program, you can see a text file program.txt created in C drive of your computer. When you open the file, you can see the integer you entered.

Example 2: Read from a text file

 #include #include 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; ) 

This program reads the integer present in the program.txt file and prints it onto the screen.

If you successfully created the file from Example 1, running this program will get you the integer you entered.

Other functions like fgetchar(), fputc() etc. can be used in a similar way.

Reading and writing to a binary file

Functions fread() and fwrite() are used for reading from and writing to a file on the disk respectively in case of binary files.

Writing to a binary file

To write into a binary file, you need to use the fwrite() function. The functions take four arguments:

  1. address of data to be written in the disk
  2. size of data to be written in the disk
  3. number of such type of data
  4. pointer to the file where you want to write.
 fwrite(addressData, sizeData, numbersData, pointerToFile);

Example 3: Write to a binary file using fwrite()

 #include #include 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; ) 

In this program, we create a new file program.bin in the C drive.

We declare a structure threeNum with three numbers - n1, n2 and n3, and define it in the main function as num.

Now, inside the for loop, we store the value into the file using fwrite().

The first parameter takes the address of num and the second parameter takes the size of the structure threeNum.

Since we're only inserting one instance of num, the third parameter is 1. And, the last parameter *fptr points to the file we're storing the data.

Finally, we close the file.

Reading from a binary file

Function fread() also take 4 arguments similar to the fwrite() function as above.

 fread(addressData, sizeData, numbersData, pointerToFile);

Example 4: Read from a binary file using fread()

 #include #include 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 n2: %d n3: %d", num.n1, num.n2, num.n3); ) fclose(fptr); return 0; ) 

In this program, you read the same file program.bin and loop through the records one by one.

In simple terms, you read one threeNum record of threeNum size from the file pointed by *fptr into the structure num.

You'll get the same records you inserted in Example 3.

Getting data using fseek()

If you have many records inside a file and need to access a record at a specific position, you need to loop through all the records before it to get the record.

This will waste a lot of memory and operation time. An easier way to get to the required data can be achieved using fseek().

As the name suggests, fseek() seeks the cursor to the given record in the file.

Syntax of fseek()

 fseek(FILE * stream, long int offset, int whence);

The first parameter stream is the pointer to the file. The second parameter is the position of the record to be found, and the third parameter specifies the location where the offset starts.

Différent d'où dans fseek ()
D'où Sens
SEEK_SET Démarre le décalage depuis le début du fichier.
SEEK_END Démarre 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 #include 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 n2: %d n3: %d", 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.bindans l'ordre inverse (du dernier au premier) et l'imprimera.

Articles intéressants...