Newsgroup: it.comp.lang.c
Titolo: Redirezione output stream con fprintf

vorrei fare una cosa del genere:
fprintf(mioFileStream,<altri_parametri>);
dove mioFileStream è una variabile globale che vorrei inizializzare con
stdout ed andarla eventualmente a modificare a seconda delle esigenze.
Ma quando vado a dichiarare (nella parte delle intestazioni)
FILE *mioFileStream = stdout;
il compilatore mi da errore dicendo che stdout non è una costante, cosa non
vera, visto che dovrebbe essere dichiarata in stio.h, che ovviamente
includo.
Per giunta, se effettuo la stessa dichiarazione all'interno di una funzione,
non si presenta alcun errore di compilazione.
Dove sto sbagliando?
Grazie
        F

 non vera,
'stdout' non è una costante compile-time. In C, le inizializzazioni di
variabili con lifetime statico (quelle dichiarate fuori da una funzione, o
quelle dichiarate 'static') richiedono un'espressione che sia costante in
fase di compilazione. (In C++, invece, tale requisito non esiste.)
Max

Max M. wrote:

Quindi cosa suggeriresti di fare per aggirare il problema?

 Giovanni
Quindi tu dici che dovrei comunque lasciare la fprintf(stdout,....) ed
eventualmente andare a redirigere (attraverso freopen) lo stdout su uno mio
stream (a questo punto però... per forza un file).
Potrebbe essere un approccio buono... però sorgono due problemi:
1)se poi volessi riutilizzare normalemente lo stdout per la stampa su video,
dovrei chiudere lo stream aperto con freopen (vero?)
2)si andrebbe ad intaccare la leggibilità del codice (cioè
fprintf(stdout...) non stamperebbe per forza sullo standard output, ad
esempio).
Comunque ti ringrazio del tuo personale apporto.
        F

        F
Ciao,
perchè non valuti queste funzioni?
fileno()
dup()
dup2()
.
.
.
Spero di esserestato utile.
Un saluto. 

         F
Ciao


 all'inizio del main).
E invece io volevo fare proprio in modo di prendere due piccioni con una
fava... perchè la variabile *mioFileStream dovrebbe essere potenzialmente
modificata da tutte le procedure della libreria, quindi dev'essere
dichiarata come globale...
Mah... comunque credo che ci sia un modo semplice ed elegante per risolvere
la questione... continuerò a cercare
Ciao
        F

 dichiarata come globale...
Allora la dichiari come globale, e gli assegni un valore all'inizio del
main.
Max

 ha scritto nel messaggio 
news:WDzZd.14608$zZ1.3...@twister1.libero.it...

Scusa se insisto ma il suggerimento era questo:
FILE *myOut;
myOut = fdopen(dup(fileno(stdout)), "w");
Così è duplicato. A questo punto sta a te decidere la visibilità della 
variabile (myOut).

> perchè la variabile *mioFileStream dovrebbe essere potenzialmente

...è una libreria...  non ha main!!  :D (sigh... sob...)


Puoi mettere una variabile globale nella libreria (con la dichiarazione 
extern in un header file) e poi i programmi che usano la libreria la 
devoni inizializzare all'avvio.
Oppure fai una fuzione molto semplice:
void init_mioStreamFile(void)
{
     if (mioFileStream == NULL) {
	mioFileStream = stdout;
     }
}
che ogni funzione di libreria chiamera` all'inizio.


 wrote:

FILE * f;
int main()
{
   f = stdout;
   ...
}
-- 
Horst

 }
Questa è la primissima soluzione a cui avevo pensato... ma (lo so, sono un
rompico****ni) volevo trovare qualcosa di diverso, intrinsecamente più
semplice ed elegante...  ovviamente se non trovassi nienete del genere sarò
costretto a migrare su questo approccio
Comunque grazie.
        F

 }
Non ha main... è una libreria.

 Non ha main... è una libreria.
Come ti ho gia` risposto lo puoi fare anche se e` una libreria.
Devi solo fare quella assegnazione nei main() dei programmi che usano la 
libreria.


Fabbro ha scritto:

static FILE * fileOut = NULL;
static void initializeLib (void)
{
    static int initialized = 0;
    if (initialized == 0)
    {
        fileOut = stout;
        ... altre eventuali inizializzazioni ...
        initialized = 1;
    }
}
void funzione1 (void)
{
    initializeLib();
   ....
}
void funzione2 (void)
{
    initializeLib();
   ....
}
void funzione3 (void)
{
    initializeLib();
   ....
}
La prima funzione che viene chiamata inizializza quel che c'è da
inizializzare.
--
Cingar
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/