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");
sí, copia eso. tendrá en cuenta. gracias :) – vindyz
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). –
si alguien quiere redirigir diferentes mensajes de registro a diferentes archivos para fines de depuración, es bastante útil para eso. – vindyz