C no complica el manejo de texto. Elimina las capas de abstracción y te deja con la mecánica en bruto. Si ha estado mirando la documentación de C, probablemente haya notado que todas las funciones de entrada/salida de texto se encuentran dentro de la biblioteca stdio. Esto significa entrada/salida estándar. Es la base de cómo los programas C se comunican con el mundo exterior.

La mayoría de los principiantes comienzan con stdin y stdout. Estas son transmisiones estándar. Representan de dónde obtiene datos un programa y adónde envía resultados. Si su aplicación solo necesita una fuente de entrada y un receptor de salida, no necesita una administración de archivos compleja. Simplemente canaliza datos a través de la línea de comando.

Las seis corrientes básicas

El encabezado stdio proporciona seis comandos específicos para interactuar con estas transmisiones. Son simples. Directo.

  • printf : escribe texto formateado en stdout.
  • scanf : Lee datos formateados desde stdin.
  • pone : envía una cadena a la pantalla.
  • obtiene : Lee una línea de texto del teclado.
  • putc : escribe un solo carácter en stdout.
  • getc o getchar : Lee un solo carácter de stdin.

¿Por qué utilizar estos? Porque puedes redirigirlos. Aquí es donde C brilla. No necesita cambiar su código para leer desde un archivo en lugar de un teclado. Simplemente cambia el comando que escribes en la terminal.

Contar caracteres de forma sencilla

Veamos un ejemplo práctico. Imagine que desea un programa que cuente el total de caracteres en una entrada de texto. Aquí está el código:

Este código espera entrada. Escribes líneas. Cuando haya terminado, presione CTRL-D. Esto señala el final del archivo (eof ). La función gets devuelve cero cuando llega a eof, rompiendo el ciclo. El recuento final se imprime en la pantalla.

Pero aquí está el truco. No era necesario editar el código para contar caracteres en un archivo. Acabas de agregar una pequeña instrucción al shell.

Redirigir entrada y salida

Si compiló este programa en un ejecutable llamado xxx, puede alimentarlo con un archivo.

El corchete angular redirige el contenido de nombre de archivo a stdin. El programa cree que está leyendo desde el teclado. No lo es. Está leyendo desde el disco.

También puedes utilizar tuberías. Esto pasa la salida de un comando directamente a otro.

Este es el mismo resultado. cat vuelca el archivo a la salida estándar. La tubería lo envía a su programa.

También puede redirigir la salida. En lugar de ver el recuento en tu pantalla, puedes guardarlo.

Ahora xxx lee desde nombre de archivo y escribe el resultado en un nuevo archivo de texto llamado fuera. Esto es poderoso. Le permite encadenar herramientas sin escribir código adicional para manejar punteros de archivos.

Cuando las transmisiones no son suficientes

A veces la redirección no es suficiente. Quizás necesites abrir varios archivos a la vez. Quizás esté creando un editor de texto que guarde archivos de configuración. Quizás necesites verificar si has llegado al final de un archivo sin fallar.

En estos casos, necesita funciones de archivo directo. Estos también están en stdio, pero operan con punteros de archivos en lugar de secuencias estándar.

  • fopen : Abre un archivo para lectura o escritura.
  • fclose : cierra el archivo cuando haya terminado.
  • feof : Comprueba si has llegado al final del archivo.
  • fprintf : escribe datos formateados en un archivo específico.
  • fscanf : Lee datos formateados de un archivo específico.
  • fputs : escribe una cadena en un archivo.
  • fgets : Lee una línea de un archivo.
  • fputc : Escribe un carácter en un archivo.
  • fgetc : Lee un carácter de un archivo.

Estas funciones le dan más control. Puede gestionar varias transmisiones a la vez. Puedes decidir exactamente qué archivo obtiene qué datos.

¿Qué camino tomas? ¿La simplicidad de la redirección stdin o el control de punteros directos a archivos? Depende de lo que estés construyendo. Para guiones rápidos, la redirección es el rey. Para aplicaciones complejas, necesitará las funciones de archivo.

No existe una respuesta perfecta. Sólo compensaciones.