Historia de la pregunta:
Trabajar con archivos en el lenguaje C es una habilidad fundamental, que surgió en las primeras implementaciones del lenguaje. La biblioteca estándar de C (stdio.h) proporciona funciones universales para trabajar con flujos de entrada y salida, que hacen que los programas sean portables entre sistemas operativos.
Problema:
A menudo, los programadores principiantes cometen errores al trabajar con flujos de archivos: no verifican el resultado de abrir archivos, gestionan incorrectamente la memoria para el almacenamiento en búfer, no manejan los errores de lectura o escritura. Los errores al cerrar archivos pueden dar lugar a fugas de recursos, y el manejo incorrecto de los búferes puede causar pérdida de datos.
Solución:
Para trabajar correctamente con archivos, siempre se debe:
fopen;fread, fwrite, fscanf, fprintf para leer/escribir;fclose.Ejemplo de código:
#include <stdio.h> int main() { FILE *fp = fopen("example.txt", "w"); if (!fp) { perror("No se pudo abrir el archivo"); return 1; } fprintf(fp, "Hola, mundo! "); fclose(fp); fp = fopen("example.txt", "r"); if (!fp) { perror("Error al abrir el archivo para lectura"); return 1; } char buffer[100]; while (fgets(buffer, sizeof(buffer), fp)) { printf("%s", buffer); } fclose(fp); return 0; }
Características clave:
¿Se puede cerrar un archivo con fclose varias veces seguidas?
No, el cierre doble de un flujo de archivo conduce a un comportamiento indefinido (undefined behavior). Después de fclose, el descriptor se vuelve inválido.
¿Qué devolverá la función fread si alcanza el final del archivo?
fread devuelve el número de elementos leídos con éxito. Si se alcanza el final del archivo, el número devuelto puede ser menor de lo esperado. Siempre se deben verificar feof y ferror para el diagnóstico.
¿Se puede utilizar el mismo flujo de archivo para escribir y leer simultáneamente?
Sí, si el archivo se abre en modo "r+" o "w+", sin embargo, es necesario hacer una llamada a fflush o realizar otra operación de movimiento de posición del archivo (fseek) antes de cambiar de dirección (escritura/lectura). De lo contrario, el comportamiento no está definido.
FILE * después de fclose.fflush no llamado, flujo no cerrado).El desarrollador escribía datos en un archivo de registro sin verificar el valor devuelto por fopen. Después de agotar los descriptores, el archivo no se volvió a abrir — se perdían los mensajes del log.
Ventajas:
Desventajas:
En otra versión del código, siempre se verificaban todos los valores devueltos (fopen, fwrite, fclose). En caso de error, se imprimía un mensaje diagnóstico detallado a través de perror, y el programa terminaba correctamente, liberando todos los recursos.
Ventajas:
Desventajas: