Newsgroup: it.comp.lang.c
Titolo: freopen

(continua da post "Redirezione output stream con fprintf")
...Alla fine ho deciso di utilizzare freopen per redirigere il mio stream di
dati dallo standard output ad un file...
ora la domanda è la seguente:
come faccio a re-redirigere lo stream sullo stdout?
ovvero attualmente ho questa situazione:
stdout ------> mioFile 
ad un certo punto però vorrei che tutto tornasse come prima.... come devo
fare?
Ho provato a chiudere (con fclose) il file "mioFile"... ma non ha prodotto i
risultati sperati...
Se il programma termina, poi lo stream torna a posto, ma vorrei farlo
manualmente.
Idee?

 ha scritto nel messaggio 
news:8Jd_d.1074608$35.39...@news4.tin.it...

Ciao,
secondo me è meglio così. Non chiudere mai stdout/in/err.
#include "io.h"
int main(int argc, char* argv[])
{
 FILE *fp;
 int sHnd;
 sHnd = dup(fileno(stdout)); /* Salvo l'handle */
 fp = fopen("c:\\pippo.txt", "w"); /* Apro il mio file */
 dup2(fileno(fp), 1); /* Forzo stdout a essere handle del mio file */
 printf("Questo viene scritto in pippo.txt\n");
 fflush(stdout);
 fclose(fp);
 dup2(sHnd, 1); /* Ripristino l'handle 1 (stdout) */
 printf("Questo viene scritto a console.\n");
 fflush(stdout);
 return 0;
}
Spero ti sia utile.
Un saluto.

 Un saluto.
Ottimo... grazie
        F

Maxime ha scritto:

Peccato però che l'header "io.h" e le funzioni fileno() e dup2() non
esistano nelle librerie standard C... Di conseguenza, il programma non è
portabile.
Non ho letto il thread precedente, ma non capisco questa necessità di
redirigere stdout. Io farei semplicemente così:
#include <stdio.h>
int main (void)
{
   FILE * f;
   f = fopen("c:\\pippo.txt", "w");
   fprintf(f, "Questo viene scritto in pippo.txt\n");
   fclose(f);
   f = stdout;
   fprintf(f, "Questo viene scritto a console.\n");
   return 0;
}
--
Cingar
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/


Ciao,
in effetti il threed si prolungava già da qualche settimana sotto altro 
titolo ed evidentemente l'intenzione è quella di catturare l'output di terzi 
(processi) e non il proprio quindi la soluzione, purtroppo, non può essere 
semplice come la tua.
Lasciami, comunque, esporre la mia opinione relativamente al concetto di 
standard che, nel caso delle funzioni in causa, potrebbe essere acquisito di 
diritto. Mi si può commentare che negli ambienti grafici, queste, non 
avrebbero senso di esistere ma ribadirei che tali ambienti sono 
relativamente giovani e allora che gli standard di cui si parla, siano 
orientati a questi. Se si parla, invece, degli ambienti "console" allora mi 
domando chi non ha mai usato comandi di redirezione sia in dos
md c:\pippo > nul
che in unix
tar tvfn /dev/fd096ds15 2>&1 1> my_out.txt   /* questa è per le vecchie 
querce */
sopratutto scrivendo degli script shell/.bat. Viene quindi automatico avere 
a disposizione la redirezione dell'output anche durante la programmazione.
Inoltre, programmo in C lavorativamente da quando M$ ha prodotto il 
compilatore MSC 4.0 per MSDOS o, se preferisci, SCO ha prodotto XeniX per 
286 (per non dire la mia età) e queste funzioni le ho sempre trovate. Allora 
mi domando: cosa vuol dire standard? Chi decide cosa è standard e cosa non, 
con che ottica lo fa? Posso dirti che portando un programma di questo tipo 
da unix a dos o viceversa, ho perso più tempo a cambiare gli "/" con i "\" 
che a far funzionare i programmi.
Conosco il manifesto di questo NG e siccome ho discusso di standard credo di 
non essere stato OT ma se lo sono stato, allora mi scuso con l'GN tutto. Sti 
paraocchi...
Un saluto.