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
./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.txtEn 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