Condividi tramite


freopen_s, _wfreopen_s

Riassegna un puntatore del file. Queste versioni di freopen, _wfreopen contengono miglioramenti sulla sicurezza, come descritto in Funzionalità di sicurezza in CRT.

errno_t freopen( 
   FILE** pFile,
   const char *path,
   const char *mode,
   FILE *stream 
);
errno_t _wfreopen( 
   FILE** pFile,
   const wchar_t *path,
   const wchar_t *mode,
   FILE *stream 
);

Parametri

  • [out] pFile
    Un puntatore al puntatore del file deve essere fornito dalla chiamata.

  • [in] path
    Percorso del nuovo file.

  • [in] mode
    Tipo di accesso consentito.

  • [in] stream
    Puntatore alla struttura FILE.

Valore restituito

Ognuna di queste funzioni restituisce un codice di errore. Se si verifica un errore, il file originale viene chiuso.

Note

La funzione freopen_s chiude il file attualmente associato a stream e riassegna stream al file specificato da path. _wfreopen_s è una versione a caratteri estesi _freopen_s; gli argomenti mode e path a _wfreopen_s sono stringhe di caratteri estesi. _wfreopen_s e _freopen_s si comportano in modo identico in caso contrario.

Se uno qualsiasi dei pFile, path, mode, o stream sono NULL, o se path è 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 EINVAL.

Mapping di routine su testo generico

Routine TCHAR.H

_UNICODE & _MBCS non definiti

_MBCS definito

_UNICODE definito

_tfreopen_s

freopen_s

freopen_s

_wfreopen_s

freopen_s 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 è definito, la chiamata a freopen_s fallisce.

  • "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. Al termine della scrittura in coda, il comando MS-DOS TYPE visualizza solamente i dati fino all'originale marcatore EOF e non tutti dati che sono stati 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 scrivere in coda ad un file di flusso che termina con il marcatore CTRL+Z EOF.

Quando il tipo di accesso specificato è "r+", "w+", o "a+", è consentita sia la lettura che la scrittura (il file viene aperto per "l'aggiornamento"). Tuttavia, quando si passa da lettura e scrittura, deve esserci una operazione intermedia fsetposcorrispondente, fseek o rewind. Se desiderata, 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 come carattere di fine file nell'input. 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_s

<stdio.h>

_wfreopen_s

<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_s.c
// 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 )
{
   errno_t err;
   // Reassign "stderr" to "freopen.out": 
   err = freopen_s( &stream, "freopen.out", "w", stderr );

   if( err != 0 )
      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" );
}
  

Equivalente .NET Framework

Vedere anche

Riferimenti

I/O di flusso

freopen, _wfreopen

fclose, _fcloseall

_fdopen, _wfdopen

_fileno

fopen, _wfopen

_open, _wopen

_setmode