Contexte de la question :
Travailler avec des fichiers en C est une compétence fondamentale qui remonte aux premières implémentations du langage. La bibliothèque standard C (stdio.h) fournit des fonctions universelles pour travailler avec des flux d'entrée-sortie, rendant les programmes portables entre les systèmes d'exploitation.
Problème :
Souvent, les programmeurs débutants commettent des erreurs lors du travail avec des flux de fichiers : ils ne vérifient pas le résultat de l'ouverture des fichiers, gèrent mal la mémoire pour la mise en tampon, ne traitent pas les erreurs de lecture ou d'écriture. Des erreurs lors de la fermeture des fichiers entraînent des fuites de ressources, et un travail incorrect avec les tampons peut entraîner des pertes de données.
Solution :
Pour travailler correctement avec des fichiers, il est toujours nécessaire de :
fopen ;fread, fwrite, fscanf, fprintf pour la lecture/écriture ;fclose.Exemple de code :
#include <stdio.h> int main() { FILE *fp = fopen("example.txt", "w"); if (!fp) { perror("Échec de l'ouverture du fichier"); return 1; } fprintf(fp, "Hello, world! "); fclose(fp); fp = fopen("example.txt", "r"); if (!fp) { perror("Erreur d'ouverture du fichier pour la lecture"); return 1; } char buffer[100]; while (fgets(buffer, sizeof(buffer), fp)) { printf("%s", buffer); } fclose(fp); return 0; }
Caractéristiques clés :
Peut-on fermer un fichier avec fclose plusieurs fois de suite ?
Non, une fermeture double d'un flux de fichier entraîne un comportement indéfini. Après fclose, le descripteur devient invalide.
Que renvoie la fonction fread si elle atteint la fin du fichier ?
fread retourne le nombre d'éléments lus avec succès. Si la fin du fichier est atteinte, le nombre retourné peut être inférieur à ce qui était attendu. Il est toujours nécessaire de vérifier feof et ferror pour le diagnostic.
Peut-on utiliser le même flux de fichier pour écrire et lire en même temps ?
Oui, si le fichier est ouvert en mode "r+" ou "w+", cependant, il est nécessaire de faire un appel à fflush ou une autre opération de déplacement de la position du fichier (fseek) avant de changer de direction (écriture/lecture). Sinon, le comportement n'est pas défini.
FILE * après fclose.fflush non appelé, flux non fermé).Un développeur écrivait des données dans un fichier journal sans vérifier la valeur de retour de fopen. Après l'épuisement des descripteurs, le fichier ne s’ouvrait plus — les messages de journal étaient perdus.
Avantages :
Inconvénients :
Dans une autre version du code, toutes les valeurs de retour étaient toujours vérifiées (fopen, fwrite, fclose). En cas d'erreur, un message diagnostic détaillé était imprimé via perror, et le programme se terminait correctement, libérant toutes les ressources.
Avantages :
Inconvénients :