Archivos (1): fopen y fclose

En la tercera TERCERA TEMPORADA del Tutorial de C vamos a hablar de lo que hay dentro de stdio.h. Hoy empezamos a hablar de archivos dedicándole su tiempo a hablar de cómo usar las funciones fopen y fclose.

Cuando trabajamos con C, una de las librerías que usamos constantemente es la estándar de entrada y salida, stdio.h. Esta librería no solo nos permite imprimir datos en pantalla con printf, sino que también nos ofrece herramientas para manejar archivos, una funcionalidad fundamental para cualquier programa que necesite guardar y recuperar información entre ejecuciones.

Para empezar a trabajar con archivos en C, lo primero que debemos saber es cómo abrirlos. La función que nos permite hacer esto es fopen, cuyo nombre proviene de file open. Esta función recibe dos parámetros: el primero es el nombre del archivo con el que queremos trabajar, y el segundo es el modo en que queremos acceder a ese archivo.

El nombre del archivo puede ser algo como "temperaturas.dat", aunque en sistemas Unix y Linux las extensiones no son tan estrictas como en Windows. Lo importante es que el sistema operativo pueda localizar ese archivo para abrirlo.

El modo de apertura es un string que indica si queremos leer, escribir o hacer ambas cosas en el archivo. Por ejemplo, "r" abre el archivo en modo solo lectura, lo que significa que podemos leer su contenido pero no modificarlo. Por otro lado, "w" abre el archivo para escritura, borrando su contenido previo y dejando el archivo listo para que escribamos desde cero. También existe el modo "r+", que permite tanto leer como escribir en el archivo.

Cuando usamos fopen, esta función nos devuelve un puntero a un tipo especial llamado FILE. Este puntero es conocido como descriptor de archivo y es fundamental para identificar y manipular el archivo abierto dentro de nuestro programa. Por ejemplo, podríamos abrir un archivo así:

FILE *temperaturas = fopen("temperaturas.dat", "r");

Es muy importante comprobar que la apertura del archivo haya sido exitosa. Si el archivo no existe o no puede abrirse por alguna razón, fopen devolverá un valor nulo (NULL). Por eso, siempre debemos verificar el resultado antes de continuar:

if (temperaturas == NULL) {
    printf("No he podido abrir el archivo\n");
    return 1;
}

Este paso es crucial porque al trabajar con recursos externos, como archivos en disco, pueden ocurrir errores que debemos manejar para evitar que nuestro programa falle inesperadamente.

Una vez que hemos terminado de trabajar con un archivo, no basta con dejarlo abierto. Es necesario cerrarlo para liberar recursos del sistema operativo y permitir que otros programas puedan acceder a ese archivo si lo necesitan. Para esto usamos la función fclose, a la que le pasamos el descriptor del archivo que queremos cerrar:

fclose(temperaturas);

Si no cerramos los archivos correctamente, podemos encontrarnos con problemas como bloqueos o pérdida de datos.

Además, si estamos trabajando en sistemas tipo Unix, podemos consultar la documentación de estas funciones directamente desde la terminal usando las manpages, por ejemplo con man fopen. Esto nos proporciona información detallada sobre los parámetros, modos y comportamiento de estas funciones estándar.

En resumen, abrir un archivo con fopen nos permite acceder a su contenido para leer o escribir, siempre verificando que la apertura haya sido exitosa. Y cerrar el archivo con fclose es igual de importante para mantener la integridad de los datos y el buen funcionamiento del sistema. Así, podemos guardar el estado de nuestros programas y recuperar información entre ejecuciones, algo esencial para aplicaciones reales como procesadores de texto o cualquier software que maneje datos persistentes.

Lista de reproducción
  1. 1
    Instalar CodeBlocks
    15 minutos
  2. 2
    Funciones y hola mundo
    17 minutos
  3. 3
    Variables y tipos de datos
    17 minutos
  4. 4
    Condicionales y operadores lógicos
    16 minutos
  5. 5
    Bucles
    11 minutos
  6. 6
    Punteros
    12 minutos
  7. 7
    Arrays
    14 minutos
  8. 8
    Estructuras
    12 minutos
  9. 9
    Otras construcciones de C
    9 minutos
  10. 10
    Memoria dinámica
    8 minutos
  11. 11
    El preprocesador (parte 1)
    10 minutos
  12. 12
    El preprocesador (parte 2)
    9 minutos
  13. 13
    Archivos de cabecera y múltiples .c (parte 1)
    8 minutos
  14. 14
    Archivos de cabecera y múltiples .c (parte 2)
    9 minutos
  15. 15
    C desde la línea de comandos (parte 1)
    8 minutos
  16. 16
    C desde la línea de comandos (parte 2)
    9 minutos
  17. 17
    Break y continue
    10 minutos
  18. 18
    Goto
    13 minutos
  19. 19
    Manipulación de bits
    15 minutos
  20. 20
    Máscaras de bit
    19 minutos
  21. 21
    Archivos (1): fopen y fclose
    13 minutos
  22. 22
    Archivos (2): leer con fgetc
    9 minutos
  23. 23
    Archivos (3): fseek y ftell
    11 minutos
  24. 24
    Archivos (4): leer con fgets
    9 minutos
  25. 25
    Archivos (5): fputc y fputs
    7 minutos
  26. 26
    Archivos (6): volcar en archivos con fwrite
    10 minutos
  27. 27
    Archivos (7): fread, fwrite y los arrays
    10 minutos
  28. 28
    Archivos (8): entrada estándar y salida estándar
    9 minutos
  29. 29
    Archivos (9): buffers
    14 minutos
  30. 30
    Archivos (y 10): otras funciones útiles con archivos
    5 minutos
  31. 31
    printf (1)
    18 minutos
  32. 32
    printf (parte 2)
    12 minutos
  33. 33
    scanf (parte 1)
    17 minutos
  34. 34
    scanf (parte 2)
    17 minutos
  35. 35
    fprintf, sprintf y snprintf
    8 minutos
  36. 36
    Tipos de datos opacos
    13 minutos
  37. 37
    Bibliotecas estáticas
    13 minutos
  38. 38
    Bibliotecas dinámicas
    15 minutos
  39. 39
    Más flags: i mayúscula (include), wall, werror, pedantic...
    12 minutos
  40. 40
    pkg-config
    12 minutos
  41. 41
    Make
    17 minutos
  42. 42
    GDB
    21 minutos
  43. 43
    Variables globales
    6 minutos
  44. 44
    extern
    9 minutos
  45. 45
    Funciones variádicas
    12 minutos
  46. 46
    El optimizador de GCC y la opción -O
    12 minutos
  47. 47
    Volatile
    6 minutos