====== Lecture / écriture de fichiers ====== ===== La commande fopen ===== Il faut utiliser la commande ''fopen'' qui se trouve dans '''' #include int main() { FILE* fichier = fopen("nom_du_fichier", "r"); } * ''FILE'' est un type défini dans '''' * ''fichier'' pointe sur le fichier. === Les modes === * ''%%"r"%%'' : lecture seule * ''%%"w"%%'' : écriture seule (pas lecture !). Si le fichier n'existe pas, il est créé. * ''%%"a"%%'' : ajoute des données en fin de fichier. Si le fichier n'existe pas, il est créé. * ''%%"a+"%%'' : avec lecture en plus. * ''%%"r+"%%'' : lecture / écriture. Le fichier doit exister au préalable. * ''%%"w+"%%'' : lecture / écriture. Si le fichier n'existe pas, il est créé. === Tester le succès === En cas de problème, ''fichier'' reçoit la valeur ''NULL''. int main() { FILE* fichier = fopen("nom_du_fichier", "r"); if (fichier == NULL) { // échec return 1; } // succès // suite du code... return 0; } === Penser à fermer le fichier === On utilise ''fclose'' int main() { FILE* fichier = fopen("nom_du_fichier", "r"); if (fichier == NULL) { // échec return 1; } // succès // suite du code... // quand on fini de manipuler le fichier fclose(fichier); // suite de ce qu'on a à faire // ... return 0; } ===== Écrire dans le fichier ===== Quand on écrit, il y a des flux : * Le flux standard pour écrire (sortie du point de vue de la machine) est l'écran. C'est ''stdout'' (standard output) qui reçoit l'id 1. * Notre variable ''fichier'' est aussi un identifiant. Ainsi, quand on utilise ''printf'' on écrit forcément à l'écran, donc dans ''stdout''. Il existe une autre commande, ''fprintf'', qui permet de spécifier le flux cible. * ''fprintf(1, ...)'' envoie vers ''stdout'' c'est donc la même chose que ''printf''. * ''fprintf(fichier, ...)'' envoie vers le fichier. ==== Autres commandes ==== * ''%%fputc('A', fichier)%%'' permet d'ajouter le caractère A dans le fichier.\\ Remarquez qu'en C on utilise les guillemets simples ''%%'...'%%'' pour un simple caractère. * ''%%fputs("lalala", fichier)%%'' permet d'ajouter une chaîne. ===== Lire dans un fichier ===== La encore nous avons des flux. Le flux standard pour lire (entrée du point de vue de la machine) est le clavier. C'est ''stdin'' (standard input) qui reçoit l'id 0 Il faut imaginer que l'on a un curseur de lecture. Le curseur est initialement placé sur le premier caractère et il avance à chaque lecture. * ''int c = fgetc(fichier);'' permet de lire le prochain caractère.\\ Si on a atteint la fin du fichier, on reçoit ''EOF'' (//End Of File)//). int c = fgetc(fichier); while (c != EOF) { // traitement quelconque... c = fgetc(fichier); } * ''fgets'' permet de lire une chaîne. On lit au maximum ''n'' caractères. Si ''%%'\n'%%'' est rencontré, ne va pas plus loin. #define TAILLE_MAX 1000 int main() { FILE* fichier = NULL; char chaine[TAILLE_MAX] = ""; fichier = fopen("test.txt", "r"); if (fichier == NULL) { return 1; } fgets(chaine, TAILLE_MAX, fichier); // lit au maximum TAILLE_MAX caractères du fichier // traitement sur chaine... fclose(fichier); return 0; } ==== Lecture formatée avec fscanf ==== De même que ''printf'' a sa version ''fprintf'' permettant de sélectionner le flux, ''scanf'' a sa version ''fscanf''. Supposons que le texte contienne 3 nombres ''78 89 52''. On peut récupérer ces nombres avec ''fscanf'' : int main() { FILE* fichier = NULL; int nombres[3]; fichier = fopen("test.txt", "r"); if (fichier == NULL) { return 1; } fscanf(fichier, "%d %d %d", &nombre[0], &nombre[1], &nombre[2]); // plus besoin du fichier fclose(fichier); // traitement voulu... par exemple on fait la somme : int s = nombre[0] + nombre[1] + nombre[2]; printf("%d\n", s); return 0; } La précision de ''%%"%d %d %d"%%'' dans le format de ''fscanf'' permet de récupérer trois nombres en une fois. On aurait pu faire 3 fois un ''fscanf'' avec un format plus simple ''%%"%d"%%''.