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

Come devo fare per creare un file all'interno di una directory, con fopen?
Stando al manuale Tricky C  basta dare, come parametro a fopen, il nome del
file completo di path
come nella seguente riga di codice:
out= fopen("C:\PROVE\PIPPO.BAK","wt");
che dovrebbe creare un file PIPPO.BAK nella directory PROVE, cosa che perň
non accade.
Potete spiegarmi come devo fare?
Grazie,
Paolo

 Potete spiegarmi come devo fare?
1) scrivi "C:\\PROVE\\PIPPO.bak";
2) "t" non e' un componente ammesso dallo standard per il modo di apertura;
3) controlla "out" (se tu lo avessi fatto avresti trovato NULL, vista la
   impossibilita' di creare il file con la tua istruzione).
-- 
Maurizio Loreti                      
http://wwwcdf.pd.infn.it/~loreti/mlo.html
Un. of Padova, Dept. of Physics - Padova, Italy          
lor...@padova.infn.it

Potete spiegarmi come devo fare?
Come prima cosa ti sconsiglio vivamente di utilizzare "Tricky C" come
manuale di riferimento.
Tale manualetto, infatti, e' soltanto (parole dell'autore) una
raccolta di appunti per il Borland C/DOS modalita' reale/Intel 80x86.
Inoltre e' pieno zeppo di errori ed imprecisioni.
Ci sono molti testi migliori (anche on-line) sul C che ti possono
aiutare.
Il carattere "\" in C, all'interno delle stringhe, ha un significato
speciale e per rappresentarlo correttamente devi raddoppiarlo con
"\\".
La modalita' di apertura "t" non e' portabile, in quanto solo il DOS
compie una differenza tra file di testo e file binari.
Infine, il risultato di un'operazione del genere va sempre
controllato.
Cioe', dato che la funzione fopen() ritorna NULL in caso di errore,
bisognerebbe controllare il risultato come nell'esempio seguente :
if ( ( out = fopen( "C:\\PROVE\\PIPPO.BAK", "wt" ) ) == NULL ) 
{
   fprintf( stderr, "Impossibile aprire il file PIPPO.BAK !" ) ;
   exit( 1 ) ;
}
else 
...

Potete spiegarmi come devo fare?
Forse perchč non hai utilizzato i doppi slash ("C:\\PROVE\\PIPPO.BAK") nel
percorso?
Comunque la chiamata a fopen dovrebbe creare il file (ho provato
personalmente). Stai attento perň che il file viene creato, ma tutto ciň che
vi viene scritto con i vari fwrite e fput.. viene realmente memorizzato su
disco solo dopo la chiamata a fclose.
Ciao, Giuseppe

disco solo dopo la chiamata a fclose.
Non necessariamente, c'e' anche il caso in cui ci sia la chiamata a
fseek() o rewind() ed in tal caso il buffer di output viene svuotato.


come si può fare per far scrivere, diciamo, "più spesso" sul file invece di
aspettare la fclose()?

 wrote:
[ snip ]
BPoSDN>come si puň fare per far scrivere, diciamo, "piů spesso" sul file 
BPoSDN>invece di aspettare la fclose()?
Puoi usare la funzione 'fflush()'.
Ciao ciao,
Andrea
-- 
"...Unix, MS-DOS, and Windows NT (also known as the Good, the Bad, and 
 the Ugly)."
(by Matt Welsh)

Puoi usare la funzione 'fflush()'.
...oppure utilizzare fseek()/rewind() tra un'operazione e l'altra di
i/o....

aspettare la fclose()?
Premetto che parlo solo per esperienza personale.
Esistono le funzioni fflush (che memorizza il buffer su disco) e flushall
(scarica su disco tutti i buffer aperti).
Ciao, Giuseppe

(scarica su disco tutti i buffer aperti).
Attenzione : flushall() non esiste nello standard e, se fa cio' che
dici, puo' essere sostituita da fflush( NULL ).

 Puoi usare la funzione 'fflush()'.
Ho bisogno di richiamare un flush
su file descriptor aperto.
Esiste un corrispondente dell fflush
per il file desciptor?

>Puoi usare la funzione 'fflush()'.
AL>...oppure utilizzare fseek()/rewind() tra un'operazione e l'altra di
AL>i/o....
Da "info libc 'Function index' fseek":
-------------------------------------------------------------------------
     `fseek' either flushes any buffered output before setting the file
     position or else remembers it so it will be written later in its
     proper place in the file.
-------------------------------------------------------------------------
Mi pare che non *assicuri* lo scaricamento dei buffer...


Mi pare che non *assicuri* lo scaricamento dei buffer...
Dallo standard :
"A change of input/output direction on an update file is only allowed
following a fsetpos, fseek, rewind, or fflush operation, since these
are precisely the functions which assure that the I/O buffer has been
flushed."

per il file desciptor?
Non in modo standard.
Potrebbe esserci una routine apposita con il tuo compilatore.

 wrote:
[ snip ]
NL>Ho bisogno di richiamare un flush
NL>su file descriptor aperto.
Puoi usare 'fsync()'. Prova anche a dare un'occhiata a 'fdatasync()'.
Sono entrambe funzioni Posix (POSIX.1b).


 wrote:
[ snip ]
AL>Dallo standard :
AL>"A change of input/output direction on an update file is only allowed
AL>following a fsetpos, fseek, rewind, or fflush operation, since these
AL>are precisely the functions which assure that the I/O buffer has been
AL>flushed."
O.K. grazie.
Scusa la curiosita', ma lo standard dove lo hai trovato ?


>Scusa la curiosita', ma lo standard dove lo hai trovato ?
Non e' esattamente lo standard, in quanto non ce n'e' una copia
on-line, ma e' l'ANSI Rationale, sviluppato in concomitanza e che ne
riassume le caratteristiche.
Lo puoi scaricare da 
http://www.lysator.liu.se/c/
Ci sono anche, comunque, i draft in formato .PDF/.PS del comitato di
standardizzazione.