Sobre stdin y stdout

Sobre stdin y stdout

de Gregory Randall -
Número de respuestas: 0

Estimados,

stdin, stdout y stderr son punteros a archivos que el sistema abre al ejecutar un programa C y que cierra cuando finaliza la ejecución del programa. Los tres son del tipo FILE *, es decir que son de tipo puntero a un tipo especial llamado FILE. Todo esto está definido en stdio.h.

stdin está asocido al teclado, y toda información que uno introduzca por ese medio va al archivo stdin

stdout está asociado a la pantalla y toda información que se escriba desde un programa en ese archivo se redirige a la pantalla.

stderr está asociado a la pantalla y toda información que se escriba desde un programa en ese archivo se redirige a la pantalla.

uno puede ejecutar un programa y decirle que alguno de estos punteros de archivo standard se redirija a un archivo físico. Para eso se usa el > y el <

supongamos que queremos ejecutar el programa "toto" y que en vez de recibir en stdin los caracteres desde el teclado los reciba del archivo "archivo.txt". Eso se logra diciendo:

./toto < archivo.txt

que redirige stdin desde el teclado al archivo que est[a a la derecha del signo <

supongamos que queremos ejecutar el programa "toto" y que en vez de escribir los caracteres en la pantalla queremos que los escriba en el archivo "out.txt" . Eso se logra diciendo:

./toto > out.txt

Si quiero que haga ambas cosas se hace

./toto < archivo.txt > out.txt

ahora bien. El programa ejecutable "toto" puede tener argumentos, que se leen usando argv y argc. Si al invocar el programa aparece un signo < o > lo que est[a delante de eso NO se cuenta como argumento. Por ejemplo en el caso siguiente

./toto < archivo.txt > out.txt

argc vale 1 y argv[0] es el nombre del programa

En el obligatorio queremos que ustedes ejecuten el programa y se actúe de manera diferente si pasan los nombres de los archivos como argumento;

./toto  archivo.txt  out.txt

en cuyo caso los leerán con argv y argc, y deberán declarar sendas variables de tipo * FILE que apuntarán a los archivos indicados por argv, deberán abrir esos archivos y al finalizar cerrarlos. Y usarlos para leer, codificar y salvar el resultado.

Tambien queremos que exista la posibilidad de invocar el programa así:

./toto < archivo.txt > out.txt

En cuyo caso argc vale 0 y lo que tenemos es que los datos de archivo.txt están en stdin y el resultado que escribamos en stdout va a escribirse en el archivo out.txt

En ese caso tenemos la ventaja de que no es necesario abrir los archivos ni cerrarlos, el sistema lo hace por nosotros.

Se entiende?

saludos

gregory