2011-02-11 39 views
6

hola quiero, ¿cómo podemos obtener información de stdin de nuevo después de invoco:Tomando la entrada de la entrada estándar después freopen()

freopen("Smefile.txt","r",stdin); 

Precisamente Quiero que mi primera vez en el primero de mi programa debe tomar la entrada de un designado archivo la siguiente parte tomaría desde el stdin.

igual:

int a,b; 
freopen("Smefile.txt","r",stdin); 
scanf("%d",&a); 

{ 
    //some block here such that the next cin/scanf takes b from standard input 
} 
cin>> b; 
cout <<a<<" "<<b; 

¿Alguna idea?

+1

¿Por qué no usar simplemente un segundo identificador de archivo para su archivo, en lugar de volver a utilizar 'stdin'? –

+0

Es posible que haya soluciones alternativas para lograr lo que PO wans, pero la pregunta en sí es valiosa por sí misma. ¿Es posible tomar entrada desde stdin después de usar freopen() para un archivo? –

Respuesta

8

No puede. Utilice

FILE *input = fopen("Smefile.txt","r"); 

// read stuff from file 

fclose(input); 
input = stdin; 

en su lugar.

Esto no ayudará cuando esté mezclando E/S C++ y C en la misma secuencia, que no recomendaría de todos modos.

(Si usted sucede estar en Linux, puede volver a abrir /dev/stdin lugar. En Linux/Unix, también puede utilizar dup2 truco de Jerry Ataúd, pero eso es aún más peluda.)

+1

No entiendo cómo esto ayuda a mi propósito? Mi aplicación necesita leer todo el archivo primero y luego desde la entrada estándar. – Quixotic

+0

@Tretwick: Lo siento, mal camino. –

+0

Si está en Windows, el nombre del dispositivo 'con' también funcionará (tanto para stdin como para stdout). Sin embargo, no sé cómo Stderr podría ser reabierto. –

3

Es feo y (más o menos) no portátil. Utiliza fileno para recuperar el descriptor de archivo asociado con stdin y usa dup para conservar una copia del mismo. Luego haces tu freopen. Cuando haya terminado, use dup2 para asociar el descriptor de archivo stdin con el que guardó previamente, de modo que la secuencia estándar apunte al punto donde comenzó. Consulte redirect.c de la colección de fragmentos C para ver el código de demostración.

0

Mezclar C stdio y C++ IO de esta manera no es válido. Los resultados no están definidos.

Cuestiones relacionadas