post #1 (permalink) Antiguo 02-mar-2010, 20:43
Predeterminado Entrada estandar
Vieron que al cargar un programa en linux de la siguiente forma:

./miprograma < entrada

la entrada estandar (teclado) se redirige al archivo.

Necesito saber como hacer que cuando se acabe el archivo como volver a la entrada por teclado.

Se entiende?? Estuve buscando en Google pero no se como buscarlo.


PD: Obviamente puedo cambiar el "< entrada" por una path de un archivo y en el programa abrir el archivo y leer. Pero me mata la curiosidad!
__________________


Avatar de Sam
Sam
Usuario Novato
Fecha de Ingreso: sep-08
Edad: 21
Mensajes: 56
Gracias dadas: 0
Agradecido 0 veces en 0 Mensajes
Enviar un mensaje por MSN a Sam
Sam está desconectado
Responder Citando
post #2 (permalink) Antiguo 03-mar-2010, 10:20
Predeterminado
No creo que se pueda hacer eso. Una vez que la entrada ha sido redirigida, ya está, queda redirigida hasta el fin del programa.
__________________
a bonis ad meliora
Usuario Normal
Fecha de Ingreso: ago-01
Mensajes: 841
Gracias dadas: 0
Agradecido 0 veces en 0 Mensajes
AlexDirect está desconectado
Responder Citando
post #3 (permalink) Antiguo 03-mar-2010, 12:17
Predeterminado
En medio de un programa podes redirigir la entrada a otro archivo. Tenes que usar el descriptor con indice 0. por ejemplo

read(0,s,5)

si usas Scanf directamente lee desde la 0 por defecto.... entonces hay opciones que te dejan cambiar archivo que esta en el descriptar 0...pero no se como volver a poner el teclado.


Creo que te lo explique re mal....despues decime y te lo explico mejor.
__________________



Última edición por Sam; 03-mar-2010 a las 12:17
Avatar de Sam
Sam
Usuario Novato
Fecha de Ingreso: sep-08
Edad: 21
Mensajes: 56
Gracias dadas: 0
Agradecido 0 veces en 0 Mensajes
Enviar un mensaje por MSN a Sam
Sam está desconectado
Responder Citando
post #4 (permalink) Antiguo 03-mar-2010, 17:32
Predeterminado
Yo lo hago asi ./miaplicacion >> archivo.txt eso manda la lalida de esa aplicacion a un archivo txt y en windows es igual, mejor dicho en DOS es igual

saludos.
Usuario Novato
Fecha de Ingreso: sep-09
Mensajes: 52
Gracias dadas: 0
Agradecido 0 veces en 0 Mensajes
mflores está desconectado
Responder Citando
post #5 (permalink) Antiguo 03-mar-2010, 17:36
Predeterminado
perdon lei mal, lo que yo puse es salida standar
Usuario Novato
Fecha de Ingreso: sep-09
Mensajes: 52
Gracias dadas: 0
Agradecido 0 veces en 0 Mensajes
mflores está desconectado
Responder Citando
post #6 (permalink) Antiguo 03-mar-2010, 22:06
Predeterminado
sisi y pusiste como redireccionarla a un archivo... yo quiero el proceso inverso si invocaste se esa forma volver a lo anterior....

Es solo una curiosidad.
__________________


Avatar de Sam
Sam
Usuario Novato
Fecha de Ingreso: sep-08
Edad: 21
Mensajes: 56
Gracias dadas: 0
Agradecido 0 veces en 0 Mensajes
Enviar un mensaje por MSN a Sam
Sam está desconectado
Responder Citando
post #7 (permalink) Antiguo 05-mar-2010, 15:07
Cool
Cita:
Iniciado por Sam Ver Mensaje
En medio de un programa podes redirigir la entrada a otro archivo. Tenes que usar el descriptor con indice 0. por ejemplo
read(0,s,5)
si usas Scanf directamente lee desde la 0 por defecto.... entonces hay opciones que te dejan cambiar archivo que esta en el descriptar 0...pero no se como volver a poner el teclado.
No entiendo bien qué querés hacer. Yo entendí que vos querías que una vez que se acaba el archivo (redirigido) vuelva a leer desde el teclado. Si el programa está hecho para leer del teclado y lo redirigís desde un archivo, no se puede re-redirigir a otro lado.
Pero, desde el programa tenés acceso a todos los streams. En lugar de scanf(), que lee de la entrada standard (stdin), podés usar fscanf() que es igual pero en lugar de stdin lee del stream que vos le digas. Por ej:
fscanf(Archivo, "%d", &var)
fscanf(stdin, "%d", &var)
este último es lo mismo que hacer scanf("%d", &var)
__________________
a bonis ad meliora
Usuario Normal
Fecha de Ingreso: ago-01
Mensajes: 841
Gracias dadas: 0
Agradecido 0 veces en 0 Mensajes
AlexDirect está desconectado
Responder Citando
post #8 (permalink) Antiguo 05-mar-2010, 15:36
Predeterminado
Si alex lo sabia eso y es lo que mas combiene y creeria que es lo correcto...

Al usar el "<" el stdin apunta al archivo... si haces scanf vas a leer del archivo.

mi pregunta es como puedo hacer en medio del programa que vuelva a apuntar al teclado.
__________________


Avatar de Sam
Sam
Usuario Novato
Fecha de Ingreso: sep-08
Edad: 21
Mensajes: 56
Gracias dadas: 0
Agradecido 0 veces en 0 Mensajes
Enviar un mensaje por MSN a Sam
Sam está desconectado
Responder Citando
post #9 (permalink) Antiguo 05-mar-2010, 16:33
Predeterminado
scanf() lee de un stream, un archivo es un stream y la entrada standard (stdin) también.
Así que si yo hago:
Código:
FILE * stream;
 int entero;

stream = fopen("Archivo.txt", "r")
fscanf(stream, "%d", &entero);
stream = stdin;
fscanf(stream, "%d", &entero);
El primer fscanf va a leer desde Archivo.txt y el segundo desde el teclado. Si la entrada es redirigida con "<" entonces el primer scanf sigue leyendo de Archivo.txt pero el segundo lee del archivo redirigido.
Ahora si lo que querés hacer es lo contrario, se complica ya que desde el punto de vista del programa la entrada ya viene redirigida. No hay manera de hacer que stdin vuelva a apuntar al teclado. De hecho, para el programa no hay manera de distinguir si viene de un archivo o del teclado (justo ahí está la gracia de la redirección).
De todos modos, si mal no recuerdo en C hay funciones que leen directo de teclado, no de la entrada standard. Obvio que esas funciones no se pueden redirigir.
__________________
a bonis ad meliora

Última edición por AlexDirect; 05-mar-2010 a las 16:55
Usuario Normal
Fecha de Ingreso: ago-01
Mensajes: 841
Gracias dadas: 0
Agradecido 0 veces en 0 Mensajes
AlexDirect está desconectado
Responder Citando
Respuesta

Herramientas Buscar en Tema
Buscar en Tema:

Búsqueda Avanzada
Desplegado

Ir al Foro


La franja horaria es GMT -3. Ahora son las 08:42.