Archivos (y 10): otras funciones útiles con archivos

Cerramos el bloque dedicado a archivos para hablar sobre un par de funciones que permiten trabajar con el sistema de archivos de una forma simple. Con las funciones rename y remove podemos renombrado y eliminar archivos.

Cuando trabajamos con archivos en C, además de las funciones básicas para abrir, leer y escribir, existen otras utilidades que pueden facilitarnos ciertas tareas comunes. Aunque no siempre sean las más potentes o recomendables según el sistema operativo, conviene conocerlas para completar nuestro repertorio. Vamos a ver tres funciones que están en la biblioteca estándar stdio.h y que nos permiten borrar archivos, renombrarlos y crear archivos temporales.

La función remove es la forma más sencilla de borrar un archivo desde C. Solo tenemos que pasarle el nombre del archivo que queremos eliminar, por ejemplo "temporal.txt". Si la llamada a remove devuelve 0, significa que el archivo se ha borrado correctamente; si devuelve un valor distinto de 0, algo ha fallado, como que el archivo no exista o no tengamos permisos para borrarlo. Así, podemos controlar el resultado y mostrar un mensaje adecuado si no se ha podido eliminar el archivo.

int result = remove("temporal.txt");
if (result != 0) {
    printf("No se ha borrado el archivo.\n");
}

Probando esto, si el archivo "temporal.txt" está presente, desaparece tras la llamada. Si intentamos borrarlo de nuevo, la función nos indicará que no se ha podido porque ya no existe.

Otra función útil es rename, que nos permite cambiar el nombre de un archivo. Le pasamos primero el nombre actual y luego el nuevo nombre que queremos darle. Al igual que con remove, devuelve 0 si todo ha ido bien y un valor distinto de 0 si ha habido algún problema. Esto nos permite, por ejemplo, renombrar "temporal.txt" a "ahora_si.txt" y verificar que la operación se ha realizado correctamente.

int code = rename("temporal.txt", "ahora_si.txt");
if (code != 0) {
    printf("No se ha renombrado el archivo.\n");
}

Si volvemos a intentar renombrar "temporal.txt" después de haberlo cambiado, la función fallará porque el archivo original ya no existe bajo ese nombre.

Por último, está la función tmpfile, que crea un archivo temporal para que podamos usarlo durante la ejecución del programa sin preocuparnos por su nombre ni por eliminarlo manualmente. Esta función no recibe parámetros y devuelve un puntero a FILE si ha tenido éxito, o NULL si ha fallado. El archivo temporal que crea se elimina automáticamente cuando cerramos el archivo con fclose o cuando termina el programa.

FILE *fp = tmpfile();
if (fp == NULL) {
    printf("No se pudo crear el archivo temporal.\n");
} else {
    fputs("Contenido temporal\n", fp);
    // Podemos usar fp para leer o escribir mientras dure el programa
    fclose(fp); // El archivo se elimina automáticamente aquí
}

Sin embargo, hay que tener en cuenta que tmpfile no siempre funciona igual en todas las plataformas. En sistemas Linux y otros Unix, el archivo temporal se crea y se elimina inmediatamente en el sistema de archivos, por lo que no lo veremos físicamente en la carpeta temporal. En Windows, puede que el archivo se guarde en alguna carpeta temporal del sistema, pero también puede fallar si no tenemos permisos para acceder a esa ubicación. Por eso es fundamental comprobar siempre que tmpfile no devuelva NULL antes de usar el archivo.

Además, en algunos entornos o arquitecturas, esta función puede no estar soportada o no funcionar correctamente. Por eso, si necesitamos un manejo más robusto de archivos temporales, es mejor recurrir a funciones específicas del sistema operativo o librerías externas que ofrezcan mayor control y fiabilidad.

En resumen, aunque remove y rename son funciones sencillas y bastante útiles para borrar y renombrar archivos, tmpfile es una herramienta más limitada y dependiente del entorno. Aun así, conocerlas nos ayuda a manejar archivos de forma básica y rápida en C, completando así nuestro conocimiento sobre el manejo de archivos en esta lengua.

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