Archivos (5): fputc y fputs

Con las primitivas fputc y fputs podemos escribir cadenas de caracteres o caracteres sueltos en archivos. En este vídeo muestro un ejemplo de uso, prestando atención a las particularidades de cada una de las funciones.

Cuando trabajamos con archivos en C, llega un momento en que no solo queremos leer datos, sino también escribirlos. Para ello, contamos con funciones específicas que nos facilitan esta tarea, y hoy vamos a centrarnos en dos de ellas: fputc y fputs. Ambas nos permiten escribir en archivos, pero cada una tiene su particularidad y uso adecuado según lo que necesitemos.

Primero, es fundamental recordar que para escribir en un archivo debemos abrirlo en modo escritura. Esto lo hacemos con fopen y el modo "w". Al usar este modo, el archivo se crea o se trunca, es decir, se borra todo su contenido previo y queda vacío para empezar a escribir desde cero. Si no queremos perder el contenido anterior, tendríamos que usar modos como append o read-write, pero para entender estas funciones, el modo "w" es el más sencillo y directo.

La función fputc está diseñada para escribir un solo carácter en el archivo. Su uso es muy simple: le pasamos el carácter que queremos escribir, siempre entre comillas simples porque es un char, y el descriptor del archivo. Por ejemplo, si queremos escribir la letra 'h', simplemente llamamos a fputc('h', archivo). Si repetimos esta llamada varias veces, iremos añadiendo caracteres uno a uno. Pero hay que tener en cuenta que si abrimos el archivo con "w" cada vez que lo abrimos, el contenido anterior se borra, así que si queremos escribir varias letras seguidas, debemos hacerlo en la misma sesión o manejar el archivo de otra forma.

Aunque fputc es útil para escribir caracteres individuales, puede resultar lento o tedioso si queremos escribir cadenas completas. Aquí es donde entra fputs, que nos permite escribir una cadena de caracteres completa de una sola vez. Por ejemplo, si queremos escribir "hola" en el archivo, con fputs("hola", archivo) lo hacemos de forma rápida y sencilla. Esto es especialmente útil cuando tenemos textos o mensajes completos que queremos guardar sin tener que escribir carácter por carácter.

Un aspecto importante al usar estas funciones es verificar si la escritura ha sido exitosa. En el caso de fputc, si la escritura se realiza correctamente, la función devuelve el mismo carácter que hemos escrito. Pero si ocurre algún error, como intentar escribir en un archivo abierto solo para lectura o problemas con el dispositivo de almacenamiento, fputc devuelve EOF. Por lo tanto, podemos comprobar el resultado y saber si la operación fue exitosa o no.

Con fputs sucede algo similar, aunque su retorno es un poco diferente. Si la escritura es exitosa, devuelve un valor no negativo, pero no necesariamente el número de caracteres escritos ni el contenido exacto. Si falla, también devuelve EOF. Por eso, al usar fputs, basta con comprobar que el valor devuelto no sea EOF para asegurarnos de que la escritura fue correcta.

Veamos un ejemplo sencillo que ilustra el uso de ambas funciones:

#include <stdio.h>

int main() {
    FILE *archivo = fopen("saludo.txt", "w");
    if (archivo == NULL) {
        perror("Error al abrir el archivo");
        return 1;
    }

    // Escribir caracteres individuales con fputc
    if (fputc('H', archivo) == EOF) {
        perror("Error al escribir con fputc");
    }
    if (fputc('o', archivo) == EOF) {
        perror("Error al escribir con fputc");
    }
    if (fputc('l', archivo) == EOF) {
        perror("Error al escribir con fputc");
    }
    if (fputc('a', archivo) == EOF) {
        perror("Error al escribir con fputc");
    }

    // Escribir una cadena completa con fputs
    if (fputs("\nBuenos días, ¿cómo te encuentras hoy?", archivo) == EOF) {
        perror("Error al escribir con fputs");
    }

    fclose(archivo);
    return 0;
}

En este código, primero abrimos el archivo "saludo.txt" en modo escritura. Luego, escribimos la palabra "Hola" carácter por carácter con fputc, comprobando en cada llamada si hubo error. Después, escribimos una frase completa con fputs, también verificando el resultado. Finalmente, cerramos el archivo para asegurarnos de que los datos se guarden correctamente.

Con estas funciones ya podemos empezar a crear archivos con contenido personalizado. Además, si combinamos estas técnicas con otras funciones de manejo de archivos, como fseek o ftell, podemos hacer operaciones más avanzadas, como movernos dentro del archivo para sobreescribir datos o leer y escribir en diferentes posiciones.

Así, con fputc y fputs tenemos herramientas básicas pero potentes para escribir en archivos en C, desde caracteres individuales hasta cadenas completas, siempre cuidando de abrir el archivo en el modo adecuado y verificar que la escritura se realice sin problemas.

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