Cuando ejecutamos el comando dir se nos muestra el resultado en la pantalla. Sin embargo podemos hacer que el resultado se guarde en un fichero haciendo:
dir > resultado.txt
De esta forma el listado de directorios quedará guardado en el fichero resultado.txt y no se mostrará en la pantalla.
Esto es lo que se llama redirección. En este ejemplo lo que hemos hecho ha sido redireccionar la salida utilizando '>'.
La salida del programa se dirige hacia la salida estándar (stdout, standard output). Normalmente, si no se especifica nada, la salida standard es la pantalla.
La entrada de datos al programa se hace desde la entrada estándar (stdin, standard input). Normalmente, por defecto es el teclado.
Existe una tercera opción que es la salida de error estándar (stderr, standard error). Aquí es donde se muestran los mensajes de error del programa al usuario. Normalmente suele ser la pantalla, al igual que la de salida. ¿Por qué tenemos stderr y stdout? Porque de esta forma podemos redireccionar la salida a un fichero y aún así podemos ver los mensajes de error en pantalla.
Stdin, stdout y stderr en realidad hay que verlos como ficheros:
Ya hemos visto cómo se redirecciona la salida con el dir. Ahora vamos a aplicarlo a nuestro curso con un sencillo ejemplo. Vamos a ver un programa que toma los datos del teclado y los muestra en la pantalla. Si el usuario teclea 'salir' el programa termina:
#include <stdio.h> int main() { char texto[100]; gets(texto); do { printf( "%s\n",texto ); gets(texto); } while ( strcmp(texto, "salir") != 0 ); fprintf( stderr, "El usuario ha tecleado 'salir'" ); }
En este programa tenemos una función nueva: fprintf. Esta función permite escribir en el fichero indicado. Su formato es el siguiente:
int fprintf(FILE *fichero, const char *formato, ...);
Ya veremos esta función más adelante. Por ahora nos basta con saber que funciona como printf pero nos permite indicar en qué fichero queremos que se escriba el texto. En nuestro ejemplo fichero=stderr.
Como ya hemos visto antes stderr es un fichero. Stderr es la pantalla, así que, si escribimos el texto en el fichero stderr lo podremos ver en el monitor.
Si ejecutamos el programa como hemos hecho hasta ahora tendremos el siguiente resultado (en negrita lo que tecleamos nosotros):
primera línea primera línea segunda segunda esto es la monda esto es la monda salir El usuario ha tecleado 'salir'
Como vemos el programa repite lo que tecleamos.
Si ahora utilizamos la redirección '> resultado.txt' el resultado por pantalla será (en negrita lo que tecleamos nosotros):
primera línea segunda esto es la monda salir El usuario ha tecleado 'salir'
NOTA: Seguimos viendo el mensaje final (El usuario ha tecleado 'salir') porque stderr sigue siendo la pantalla.
y se habrá creado un fichero llamado resultado.txt cuyo contenido será:
primera línea segunda esto es la monda
Si no hubiésemos usado stderr el mensaje final hubiese ido a stdout (y por lo tanto al fichero), así que no podríamos haberlo visto en la pantalla. Hubiera quedado en el fichero resultado.txt.
Existe una forma de redireccionar la salida de forma que se añada a un fichero en vez de sobreescribirlo. Para ello debemos usar '>>' en vez de '>'. Haz la siguiente prueba:
dir > resultado.txt dir >> resultado.txt
Tendrás el listado del directorio dos veces en el mismo fichero. La segunda vez que llamamos al comando dir, si usamos >>, se añade al final del fichero.
Todo esto nos sirve como una introducción al mundo de los ficheros, pero puede no ser la forma más cómoda para trabajar con ella (aunque como hemos visto es muy sencilla). El tema de los ficheros lo veremos más a fondo en el siguiente capítulo.
Ahora vamos a hacer algo curioso. Vamos a crear un fichero llamado entrada.txt y vamos a usarlo como entrada de nuestro programa. Vamos a redireccionar la entrada al fichero entrada.txt. El fichero entrada.txt debe contener lo siguiente:
Esto no lo he tecleado yo. Se escribe sólo. Qué curioso. salir
Es importante la última línea 'salir' porque si no podemos tener unos resultados curiosos (en mi caso una sucesión infinita de 'Qué curioso.'.
Para cambiar la entrada utilizamos el símbolo '<'. Si nuestro programa lo hemos llamado stdout.c haremos:
# stdout < entrada.txt
y tendremos:
primera línea segunda esto es la monda El usuario ha tecleado 'salir'
Increíble, hemos escrito todo eso sin tocar el teclado. Lo que sucede es que el programa toma los datos del fichero entrada.txt en vez del teclado. Cada vez que encuentra un salto de línea (el final de una línea) es equivalente a cuando pulsamos el 'Enter'.
Podemos incluso hacer una doble redirección: Tomaremos como entrada entrada.txt y como salida resultado.txt:
stdout < entrada.txt > resultado.txt
NOTA: Cambiando el orden también funciona:
stdout > resultado.txt < entrada.txt
Existe una forma de cambiar la salida estándar desde el propio programa. Esto se puede conseguir utilizando la función freopen:
FILE *freopen(const char *nombre_fichero, const char *modo, FILE *fichero);
Esta función hace que el fichero al que apunta fichero se cierre y se abra pero apuntando a un nuevo fichero llamado nombre_fichero. Para redireccionar la salida con este método podemos hacer:
#include <stdio.h> int main() { char texto[100]; freopen( "resultado.txt","wb",stdout ); gets(texto); do { printf( "%s\n",texto ); gets(texto); } while ( strcmp(texto, "salir") != 0 ); fprintf( stderr, "El usuario ha tecleado 'salir'" ); }
En este programa la función freopen cierra el fichero stdout, que es la pantalla, y lo abre apuntando al fichero resultado.txt. Ya veremos esta función más adelante.
© Gorka Urrutia