Lección 19 · 19 de 20
Escribir y leer archivos · C
Guarde y lea datos en un archivo de texto en C con fopen, fprintf, fscanf y fclose, y añada líneas al final con el modo "a".

Para trabajar con un archivo, `fopen` lo abre y devuelve un puntero FILE *. Si no puede abrirlo, devuelve NULL, así que hay que comprobarlo siempre. El nombre sin carpeta, "scores.txt", hace que el archivo se cree en la carpeta actual, la misma desde la que se ejecuta el programa.
El segundo argumento es el modo: "w" crea el archivo para escribir (y si ya existía, lo vacía), "a" añade al final sin borrar lo que había y "r" lo abre para leer. `fprintf` funciona como printf, pero escribe en el archivo que se le indica primero.
`fclose` cierra el archivo y se asegura de que todo lo escrito queda guardado en el disco. No lo olvide: sin él, las últimas líneas podrían perderse.
Para leer, `fscanf` hace lo mismo que scanf, pero desde el archivo. Devuelve cuántos valores ha leído; el while sigue mientras lea los dos (el nombre y la puntuación) y para al llegar al final. Mientras tanto suma los puntos para calcular la media. Si quisiera leer líneas enteras, con espacios, usaría fgets. En DMarlon Studio, tras pulsar F9, verá scores.txt junto a su programa.
Código · main.c
#include <stdio.h>int main(void) { // "w" creates the file in the current folder (or empties it). FILE *out = fopen("scores.txt", "w"); if (out == NULL) { printf("Cannot create scores.txt\n"); return 1; } fprintf(out, "Ana 87\n"); // like printf, but into the file fprintf(out, "Luis 92\n"); fprintf(out, "Marta 78\n"); fclose(out); // closing saves everything // "a" appends at the end without deleting what was there. out = fopen("scores.txt", "a"); if (out == NULL) return 1; fprintf(out, "Pablo 95\n"); fclose(out); // "r" opens it for reading; fscanf reads like scanf. FILE *in = fopen("scores.txt", "r"); if (in == NULL) return 1; char name[20]; int score, count = 0, total = 0; while (fscanf(in, "%19s %d", name, &score) == 2) { printf("%-6s %3d\n", name, score); count++; total += score; } fclose(in); printf("%d players, average %.1f\n", count, (double)total / count); return 0;}Salida · cc main.c -o main && ./main
Ana 87 Luis 92 Marta 78 Pablo 95 4 players, average 88.0
Para recordar
fopen(nombre, modo)devuelveNULLsi falla: compruébelo."w"crea o vacía,"a"añade,"r"lee.fprintfyfscanfsonprintfyscanfpara archivos.fscanfdevuelve cuántos valores ha leído.fcloseguarda y cierra.
Ejercicio
Tras leer, abra best.txt con "w" y guarde en él el nombre y la puntuación del mejor jugador; después vuelva a leerlo y escríbalo en pantalla.