freopen, _wfreopen
Riassegna un puntatore del file. Sono disponibili versioni più sicure di queste funzioni; vedere freopen_s, _wfreopen_s.
FILE *freopen(
const char *path,
const char *mode,
FILE *stream
);
FILE *_wfreopen(
const wchar_t *path,
const wchar_t *mode,
FILE *stream
);
Parametri
path
Percorso del nuovo file.mode
Tipo di accesso consentito.stream
Puntatore alla struttura FILE.
Valore restituito
Ognuna di queste funzioni restituisce un puntatore al file appena aperto. Se si verifica un errore, il file originale viene chiuso e la funzione restituisce un valore del puntatore NULL. Se path, mode, o stream è un puntatore a null, oppure se filename è una stringa vuota, queste funzioni richiamano il gestore di parametro non valido, come descritto in Convalida dei parametri. Se l'esecuzione può continuare, queste funzioni impostano errno a EINVAL e restituiscono NULL.
Vedere _doserrno, errno, _sys_errlist, e _sys_nerr per ulteriori informazioni su questi, e altri, codici di errore.
Note
Esistono versioni più sicure di queste funzioni, vedere freopen_s, _wfreopen_s.
La funzione freopen chiude il file attualmente associato allo stream e riassegna lo stream al file specificato dal path*.* _wfreopen è una versione a caratteri estesi di _freopen; il path e gli argomenti mode di _wfreopen sono stringhe di caratteri estesi. _wfreopen e _freopen si comportano in modo identico in caso contrario.
Mapping di routine su testo generico
Routine TCHAR.H |
_UNICODE & _MBCS non definiti |
_MBCS definito |
_UNICODE definito |
---|---|---|---|
_tfreopen |
freopen |
freopen |
_wfreopen |
freopen in genere viene utilizzata per reindirizzare i file precedentemente aperti stdin, stdout e stderr ai file specificati dall'utente. Il nuovo file associato a stream è aperto con mode*,* ovvero una stringa di caratteri che specifica il tipo di accesso richiesto per il file, come segue:
"r"
Viene aperto per la lettura. Se il file non esiste o non viene trovato, la chiamata a freopen avrà esito negativo."w"
Apre un file vuoto per la scrittura. Se il file specificato esiste, il contenuto viene eliminato in modo permanente."a"
Verrà aperto per la scrittura alla fine del file (in aggiunta) senza rimuovere il marcatore di EOF prima di scrivere i nuovi dati nel file; prima crea il file se non esiste."r+"
Viene aperto per la lettura e la scrittura. (Il file deve esistere.)"w+"
Apre un file vuoto per la lettura e la scrittura. Se il file specificato esiste, il contenuto viene eliminato in modo permanente."a+"
Verrà aperto per la lettura e l'aggiunta; l'operazione di aggiunta comporta la rimozione del marcatore EOF prima che i dati siano scritti nel file e il marcatore EOF viene ripristinato dopo che la scrittura è stata completata; prima crea il file se non esiste.
Utilizzare con attenzione i tipi "w+" e "w", in quanto è possibile distruggere file esistenti.
Quando un file viene aperto con il tipo di accesso "a+" o "a", tutte le operazioni di scrittura vengono fatte alla fine del file. Sebbene il puntatore del file venga riposizionato utilizzando fseek o rewind, il puntatore del file viene spostato sempre alla fine del file prima che venga effettuata qualsiasi operazione di scrittura. Pertanto, i dati esistenti non possono essere sovrascritti.
La modalità "a" non rimuove il marcatore di EOF prima di scrivere in coda al file. Una volta eseguita l'aggiunta, con il comando MS-DOS TYPE vengono visualizzati solo i dati fino al marcatore EOF originale e non tutti i dati eventualmente aggiunti al file. La modalità "a+" non rimuove il marcatore EOF prima di scrivere in coda al file. Dopo l'aggiunta, il comando MS-DOS TYPE visualizza tutti i dati nel file. La modalità "a+" è necessaria per l'aggiunta a un file di flusso che termina con il marcatore EOF CTRL+Z.
Quando il tipo di accesso "r+", "w+" o "a+" viene specificato, sono consentite sia la lettura che la scrittura (il file viene definito aperto per "l'aggiornamento"). Tuttavia, quando si passa da lettura e scrittura, devono esserci delle operazione intermedie fsetpos, fseek o rewind. La posizione corrente può essere specificata per l'operazione fseek o fsetpos. Oltre ai valori precedenti, uno dei seguenti caratteri può essere incluso nella stringa mode per specificare la modalità di traduzione per le nuove righe.
t
Aprire in modalità di testo (traduzione); le combinazioni di ritorno a capo/avanzamento della riga (CR-LF) vengono convertite in caratteri singoli di avanzamento (LF) nell'input; i caratteri LF sono tradotti come combinazioni CR-LF di output. Inoltre, CTRL+Z viene interpretato nell'input come carattere di fine file. Nei file aperti per la lettura o la scrittura e la lettura mediante "a+", la libreria di runtime controlla la presenza di un CTRL+Z alla fine del file e se possibile, lo rimuove. Questa operazione viene eseguita perché utilizzando fseek e ftell per spostarsi all'interno di un file che termina con un CTRL+Z, l'operazione fseek può causare un comportamento anomalo vicino alla fine del file. L'opzione t è un'estensione Microsoft che non deve essere utilizzata quando si vuole utilizzare la portabilità ANSI.b
Aprire in modalità binaria (non tradotta); le conversioni precedenti vengono eliminate.
Se t o b non è specificato in mode, la modalità di traduzione predefinita è definita dalla variabile globale _fmode. Se t o b è il prefisso dell'argomento, la funzione ha esito negativo e restituisce NULL.
Per una descrizione della modalità binaria e di testo, vedere I/O dei File in modalità di Testo o Binaria.
Requisiti
Funzione |
Intestazione obbligatoria |
---|---|
freopen |
<stdio.h> |
_wfreopen |
<stdio.h> o <wchar.h> |
La console non è supportata nelle applicazioni Windows Store. Gli handle del flusso standard associati alla console,stdin, stdout e stderr, devono essere reindirizzati prima di poter utilizzare le funzioni di runtime del linguaggio C nelle applicazioni Windows Store. Per ulteriori informazioni sulla compatibilità, vedere Compatibilità.
Esempio
// crt_freopen.c
// compile with: /W3
// This program reassigns stderr to the file
// named FREOPEN.OUT and writes a line to that file.
#include <stdio.h>
#include <stdlib.h>
FILE *stream;
int main( void )
{
// Reassign "stderr" to "freopen.out":
stream = freopen( "freopen.out", "w", stderr ); // C4996
// Note: freopen is deprecated; consider using freopen_s instead
if( stream == NULL )
fprintf( stdout, "error on freopen\n" );
else
{
fprintf( stdout, "successfully reassigned\n" ); fflush( stdout );
fprintf( stream, "This will go to the file 'freopen.out'\n" );
fclose( stream );
}
system( "type freopen.out" );
}