2011-08-07 10 views
5

El siguiente código redirige la salida estándar a un archivo fname & y luego redirige a la salida estándar original. Funciona bien para mí. Pero no puedo entender cómo funciona realmente. Si alguien puede ayudarme a entender lo aprecio.¿Cómo funciona esta redirección de stdout?

printf("\n This is console"); 
    fflush(stdout); 
    fgetpos(stdout, &pos); 
    fd = dup(fileno(stdout)); 
    freopen(fname, "a+", stdout); 

    printf("inside file op"); 

    fflush(stdout); 
    dup2(fd,fileno(stdout)); 
    close(fd); 
    clearerr(stdout); 
    fsetpos(stdout, &pos); 
    printf("\nBack to Console"); 
+0

sí, copia eso. tendrá en cuenta. gracias :) – vindyz

+2

Ghreat gods arriba, ¿por qué alguien querría hacer _hathat_? (Además de una solución desesperada de última hora para una biblioteca sin fuente que insiste en escribir en stdout, eso es). –

+0

si alguien quiere redirigir diferentes mensajes de registro a diferentes archivos para fines de depuración, es bastante útil para eso. – vindyz

Respuesta

14

Vamos a leerlo línea por línea. La primera línea se imprime algo que stdout:

printf("\n This is console"); 

Luego se vuelca stdout por lo que todos los datos restantes en la memoria intermedia se envía a stdout y no se mezclan con los datos del archivo:

fflush(stdout); 

Ahora almacenamos la posición actual de nosotros mismos en stdout porque de lo contrario si stdout ya estaba dirigido a un archivo, podríamos (?) Sobrescribir partes anteriores de este.

fgetpos(stdout, &pos); 

Ahora clonamos el descriptor de archivo de lo que actualmente es stdout. Ya que estamos a punto de cambiar el lugar donde stdout puntos a, tenemos que mantener una copia del original:

fd = dup(fileno(stdout)); 

Ahora que hemos conservado todo, podemos reabrir stdout que el archivo:

freopen(fname, "a+", stdout); 

En este punto, stdout ha sido redirigido al archivo. Ahora podemos imprimir en él:

printf("inside file op"); 

Ahora hemos terminado de imprimir en el archivo. Tenemos que limpiar stdout (ahora el archivo) para que no se confundan con los datos normales stdout:

fflush(stdout); 

Después de eso, clonar el descriptor stdout archivo original sobre la corriente stdout descriptor.

dup2(fd,fileno(stdout)); 

El clonado se puede cerrar ahora:

close(fd); 

No estoy seguro de por qué esto está aquí, pero esto suprime todos los errores que se produjeron al escribir en el archivo:

clearerr(stdout); 

Ahora restauramos nuestra posición en stdout. Una vez más, por lo que yo sé, esto sólo es útil si se ha redirigido originalmente en un archivo:

fsetpos(stdout, &pos); 

Ahora estamos de vuelta a la original stdout, por lo que puede imprimir de nuevo:

printf("\nBack to Console"); 
+0

suena genial ... ahora es mucho más claro. gracias, lo agradezco. – vindyz

+0

+1 para una respuesta excepcionalmente detallada. – templatetypedef

+0

hay alguna otra forma de hacerlo. puede ser más eficiente ... – vindyz

Cuestiones relacionadas