Archivos (8): entrada estándar y salida estándar

La entrada estándar y la salida estándar son vistos en C como archivos ya abiertos que permiten enviar lo que se escriba a stdout, y recibir de lo que se lea desde stdin. En este vídeo hablo de las primitivas getchar, putchar y puts, para escribir cosas directamente sobre estos descriptores.

Cuando trabajamos con C, es fundamental entender cómo funcionan la entrada y salida estándar, ya que todos los programas están conectados a estos mecanismos por defecto. La salida estándar es el sistema que nos permite enviar información desde nuestro programa hacia el exterior, y normalmente esta salida se muestra en la terminal. Por ejemplo, cuando usamos printf, estamos enviando texto a la salida estándar, que suele ser la ventana de la terminal donde ejecutamos el programa.

Sin embargo, la salida estándar no siempre tiene que ser la pantalla. En sistemas antiguos, podía estar conectada a una impresora, de modo que al ejecutar un programa, la información se imprimía directamente en papel. En entornos modernos, especialmente en sistemas Unix o similares, la salida estándar puede redirigirse mediante pipes para que la salida de un programa sirva como entrada de otro. Por ejemplo, podemos encadenar comandos como ls | wc, donde la salida del listado de archivos se pasa directamente al contador de líneas.

La entrada estándar es el mecanismo opuesto: es la forma en que el programa recibe información. Por defecto, esta entrada suele ser el teclado a través de la terminal, pero también puede ser redirigida desde archivos o la salida de otros programas. Un ejemplo sencillo es el programa tac, que invierte la entrada que recibe y la muestra por la salida estándar.

En C, la biblioteca stdio.h nos ofrece constantes y funciones para manejar estos flujos de entrada y salida estándar. Lo interesante es que, en sistemas Unix, la entrada y salida estándar se representan como archivos virtuales ubicados en la carpeta /dev, con nombres como stdin, stdout y stderr. Aunque no son archivos en disco, el sistema operativo los trata como tales, lo que permite que podamos leer y escribir en ellos usando funciones estándar para archivos.

Estas constantes, stdin y stdout, son de tipo FILE y ya vienen abiertas por el sistema cuando ejecutamos un programa. Esto significa que no necesitamos abrirlas ni cerrarlas manualmente, sino que podemos usarlas directamente para leer o escribir. Por ejemplo, si usamos fwrite con stdout, estaremos enviando datos a la salida estándar, que normalmente es la pantalla. De forma similar, con fgetc y stdin podemos leer caracteres que el usuario introduce por teclado.

Aunque funciones como printf están conectadas internamente a stdout, existen funciones más sencillas y directas para trabajar con la entrada y salida estándar. Una de ellas es puts, que escribe una cadena de texto en la salida estándar y añade automáticamente un salto de línea al final. Esto nos evita tener que incluir manualmente el carácter \n en cada llamada.

Para escribir caracteres individuales, podemos usar putchar, que es equivalente a fputc pero ya conectado a stdout. De la misma manera, para leer caracteres individuales desde la entrada estándar, está getchar, que funciona como fgetc con stdin ya configurado.

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

#include <stdio.h>

int main() {
    char c;

    puts("Escribe un carácter y pulsa Enter:");
    c = getchar();  // Lee un carácter desde la entrada estándar
    putchar(c);     // Escribe el carácter leído en la salida estándar
    putchar('\n');  // Añade un salto de línea

    return 0;
}

En este código, primero mostramos un mensaje con puts. Luego, con getchar, leemos un carácter que el usuario introduce. Finalmente, con putchar, mostramos ese mismo carácter en pantalla, seguido de un salto de línea para que la salida quede ordenada.

Este enfoque nos permite trabajar de forma sencilla y directa con la entrada y salida estándar en C, aprovechando las constantes y funciones que nos ofrece stdio.h. Así, podemos manejar texto desde y hacia la terminal sin complicaciones, entendiendo que detrás de escena estos flujos están representados como archivos virtuales que el sistema operativo gestiona para nosotros.

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