Condividi tramite


fopen_s, _wfopen_s

Apre un file. Queste versioni di fopen, wfopen avere miglioramenti della protezione, come descritto Funzionalità di sicurezza in CRT.

errno_t fopen_s( 
   FILE** pFile,
   const char *filename,
   const char *mode 
);
errno_t _wfopen_s(
   FILE** pFile,
   const wchar_t *filename,
   const wchar_t *mode 
);

Parametri

  • [out]pFile
    Puntatore al puntatore del file che verrà visualizzato il puntatore al file aperto.

  • [in]filename
    Nome del file.

  • [in]mode
    Tipo di accesso consentito.

Valore restituito

Zero se con esito positivo; un codice di errore in caso di errore. Vedere errno, _doserrno, _sys_errlist, and _sys_nerrPer ulteriori informazioni su questi codici di errore.

Condizioni di errore

pFile

filename

mode

Valore restituito

Contenuto dipFile

NULL

qualsiasi

qualsiasi

EINVAL

invariato

qualsiasi

NULL

qualsiasi

EINVAL

invariato

qualsiasi

qualsiasi

NULL

EINVAL

invariato

Note

I file aperti da fopen_se _wfopen_snon sono condivisibili. Se si richiede che un file di essere condivisibile, utilizzare _fsopen, _wfsopencon la costante di modalità di condivisione appropriato, ad esempio, _SH_DENYNOper la condivisione di lettura/scrittura.

Il fopen_sfunzione apre il file specificato da filename. _wfopen_sè una versione a caratteri estesi di fopen_s; gli argomenti da _wfopen_ssono stringhe di caratteri estesi. _wfopen_se fopen_ssi comportano in modo identico in caso contrario.

fopen_saccetta percorsi validi per il file system nel punto di esecuzione; Percorsi UNC e percorsi che coinvolgono l'unità di rete connesse vengono accettate dal fopen_sfino a quando il sistema è in esecuzione il codice ha accesso alla condivisione o unità di rete mappata in fase di esecuzione. Durante la creazione di percorsi per fopen_s, non presupporre la disponibilità di unità, percorsi, o condivisioni di rete nell'ambiente di esecuzione. È possibile utilizzare le barre (/) o barre rovesciate (\) come carattere separatore di directory in un percorso.

Queste funzioni convalidano i propri parametri. Se pFile, filename, o modeè un puntatore null, queste funzioni generano un'eccezione di parametro non valido, come descritto in Convalida dei parametri.

Controllare sempre il valore restituito per verificare se la funzione è stata completata prima di eseguire eventuali altre operazioni sul file. Se si verifica un errore, viene restituito il codice di errore e la variabile globale errnoè impostata. Per ulteriori informazioni, vedere errno, _doserrno, _sys_errlist, and _sys_nerr.

Supporto Unicode

fopen_ssupporta flussi di file Unicode. Per aprire un file Unicode nuovo o esistente, passare un ccsflag che specifica la codifica desiderata per fopen_s:

fopen_s(&fp, "newfile.txt", "rw, ccs=encoding");

Consentiti i valori di encodingsono UNICODE, UTF-8, e UTF-16LE. Se non vi è specificato alcun valore per encoding, fopen_sutilizza la codifica ANSI.

Se il file esiste già e viene aperto per la lettura o l'aggiunta, il Byte (BOM Order Mark), se presente nel file di determina la codifica. La codifica della distinta base ha la precedenza sulla codifica specificata dal ccsflag. Il ccscodifica viene utilizzata solo quando nessuna DBA è presente o se il file è un nuovo file.

Nota

Rilevamento di distinta base si applica solo ai file aperti in modalità Unicode. in altre parole, passa la ccsflag.

Nella tabella seguente sono riepilogate le modalità per varie ccsflag che viene assegnato a fopen_se per i segni di ordine di Byte nel file.

Codifiche utilizzate in base a ccs Flag e distinta base

ccsflag

Nessuna DBA (o un nuovo file)

DISTINTA BASE: UTF-8

DISTINTA BASE: UTF-16

UNICODE

UTF-16LE

UTF-8

UTF-16LE

UTF-8

UTF-8

UTF-8

UTF-16LE

UTF-16LE

UTF-16LE

UTF-8

UTF-16LE

I file aperti per la scrittura in modalità Unicode è associata una DB scritta automaticamente.

Se modeè "a, ccs=<encoding>", fopen_stenterà di aprire il file con accesso in lettura e accesso in scrittura. In caso contrario, la funzione legge la distinta base per determinare la codifica del file; in caso contrario, la funzione utilizza la codifica predefinita per il file. In entrambi i casi, fopen_squindi apre nuovamente il file con accesso in sola scrittura. (Si applica alle anon solo, modalità a+.)

Mappature di testo generico Routine

TCHAR.Routine H

Unicode & MBCS non definiti

Definizione

Definisce _ Unicode

_tfopen_s

fopen_s

fopen_s

_wfopen_s

La stringa di caratteri modeSpecifica il tipo di accesso richiesto per il file, come illustrato di seguito.

  • "r"
    Viene aperto per la lettura. Se il file non esiste o non viene trovato, il fopen_schiamata ha esito negativo.

  • "w"
    Apre un file vuoto per la scrittura. Se il file esiste, il contenuto viene eliminato.

  • "a"
    Viene aperto in scrittura alla fine del file (aggiunta) senza rimuovere il segno di EOF prima di scrivere nuovi dati al file. Crea il file se non esiste.

  • "r+"
    Viene aperto in lettura e scrittura. (Il file deve esistere).

  • "w+"
    Apre un file vuoto per la lettura e scrittura. Se il file esiste, il contenuto viene eliminato.

  • "a+"
    Viene aperto per la lettura e le aggiunte. L'operazione di aggiunta include la rimozione del marcatore EOF prima che nuovi dati vengono scritti nel file e l'indicatore EOF viene ripristinato dopo la scrittura è completa. Crea il file se non esiste.

Quando viene aperto un file utilizzando il "a"o "a+"accesso tipo, tutti a scrivere le operazioni vengono eseguite alla fine del file. È possibile riposizionare il puntatore del file utilizzando fseeko rewind, ma è sempre riportato alla fine del file prima di qualsiasi operazione venga effettuata in modo che non è possibile sovrascrivere dati esistenti di scrittura.

Il "a"modalità non rimuove il marcatore EOF prima aggiunta al file. Dopo che è stata aggiunta, il comando TYPE MS-DOS Mostra solo i dati fino al marcatore EOF originale e non i dati che viene aggiunto al file. Il "a+"modalità di rimuovere il marcatore EOF prima aggiunta al file. Dopo l'accodamento, il comando TYPE MS-DOS Mostra tutti i dati nel file. Il "a+"modalità è necessaria per l'aggiunta a un file di flusso viene interrotto utilizzando il segnaposto di fine file CTRL + Z.

Quando il "r+", "w+",o "a+"è specificato il tipo di accesso, lettura e scrittura sono consentiti. (Il file viene detto sia aperto per "update"). Tuttavia, quando passa dalla lettura di scrittura, l'operazione di input deve verificarsi un marcatore EOF. Se non vi è alcun EOF, è necessario utilizzare una corrispondente chiamata a una funzione di posizionamento di file. Le funzioni di posizionamento file sono fsetpos, fseek, e rewind. Quando si passa dalla scrittura per la lettura, è necessario utilizzare una chiamata al metodo fflusho a una funzione di posizionamento file.

Oltre ai valori sopra indicati, i seguenti caratteri possono essere incluso in modeper specificare la modalità di conversione dei caratteri di nuova riga:

  • t
    Apri in formato testo (tradotto) modalità. In questa modalità, CTRL + Z viene interpretato come un carattere di fine del file di input. Nel file aperti in lettura/scrittura con "a+", fopen_sverifica la presenza di una CTRL + Z alla fine del file e lo rimuove, se possibile. Ciò avviene perché tramite fseeke ftellper spostarsi all'interno di un file che termina con CTRL + Z, possono causare fseeksi comportino in modo non corretto verso la fine del file.

Inoltre, in modalità testo, combinazioni di ritorno di trasporto vengono convertite in avanzamenti singoli input e caratteri di avanzamento riga vengono convertiti in combinazioni di ritorno di trasporto in uscita. Quando una funzione di flusso I/O Unicode opera in modalità testo (impostazione predefinita), l'origine o il flusso di destinazione viene considerato come una sequenza di caratteri multibyte. Di conseguenza, le funzioni di input del flusso di Unicode convertono caratteri multibyte a caratteri estesi (come se da una chiamata al mbtowcfunzione). Per lo stesso motivo, le funzioni di output del flusso di Unicode convertono caratteri estesi in caratteri multibyte (come se da una chiamata al wctombfunzione).

  • b
    Apri in modalità binaria, (non tradotto); traduzioni che includono caratteri di ritorno a capo e avanzamento riga vengono soppressi.

Se to bnon è specificato mode, la modalità di conversione predefinita viene definita la variabile globale fmode. Se to bè il prefisso per l'argomento, la funzione ha esito negativo e restituisce NULL.

Per ulteriori informazioni sull'utilizzo di testo e modalità binario in formato Unicode e multibyte flusso I/O, vedere testo e binari modalità i/o e Unicode Stream i/o in modalità binaria e testo.

  • c
    Attiva il flag di commit per l'oggetto associato filenamein modo che il contenuto del buffer del file viene scritti direttamente su disco se il valore fflusho _flushallviene chiamato.

  • n
    Reimpostare il flag di commit per l'oggetto associato filenamea "no-commit". Questa è l'impostazione predefinita. Sovrascrive anche il flag di commit globale se si collega il programma con COMMODE.OBJ. Il valore predefinito di commit globale contrassegno è "no-commit" a meno che non si collega in modo esplicito il programma con COMMODE.OBJ (vedere Opzioni collegamento).

  • N
    Specifica che il file non è ereditato dai processi figlio.

  • S
    Specifica che la memorizzazione nella cache è ottimizzato per, ma non limitate per l'accesso sequenziale dal disco.

  • R
    Specifica che la memorizzazione nella cache è ottimizzato per, ma non limitato all'accesso casuale dal disco.

  • T
    Specifica un file temporaneo. Se possibile, non scaricata su disco.

  • D
    Specifica un file temporaneo. Viene eliminato quando il puntatore del file ultimo viene chiuso.

  • ccs=ENCODING
    Specificare il set da utilizzare (UTF-16LE, UNICODE e UTF-8) per il file di caratteri codificato. Lasciare questo non viene specificato se si desidera che la codifica ANSI.

I caratteri validi per il modestringa utilizzata fopen_se _fdopencorrispondono alle oflagargomenti utilizzati nella Open e _sopen, come illustrato di seguito.

Caratteri nella stringa di modalità

Equivalente oflagvalore per _open/_sopen

a

_O_WRONLY | _O_APPEND(in genere_O_WRONLY | _O_CREAT |_O_APPEND)

a+

_O_RDWR | _O_APPEND(in genere_O_RDWR | _O_APPEND | _O_CREAT )

r

_O_RDONLY

r+

_O_RDWR

w

_O_WRONLY(in genere_O_WRONLY |_O_CREAT | _O_TRUNC)

w+

_O_RDWR(in genere_O_RDWR | _O_CREAT | _O_TRUNC)

b

_O_BINARY

t

_O_TEXT

c

Nessuno

n

Nessuno

S

_O_SEQUENTIAL

R

_O_RANDOM

T

_O_SHORTLIVED

D

_O_TEMPORARY

ccs=UNICODE

_O_WTEXT

ccs=UTF-8

_O_UTF8

ccs=UTF-16LE

_O_UTF16

Se si utilizza rbmodalità, non sarà necessario il codice della porta e prevedono la lettura di una grande quantità di file e/o non interessa le prestazioni della rete, file Win32 mappati in memoria potrebbero essere anche un'opzione.

Requisiti

Funzione

Intestazione richiesta

fopen_s

< stdio. h >

_wfopen_s

< stdio. h > < WCHAR > o

Per ulteriori informazioni sulla compatibilità, vedere compatibilità nell'introduzione.

Librerie

Tutte le versioni della le librerie di runtime C.

Il c, n, e t  modeopzioni sono estensioni Microsoft per fopen_se _fdopene non deve essere utilizzato dove si desidera la portabilità ANSI.

Esempio

// crt_fopen_s.c
// This program opens two files. It uses
// fclose to close the first file and
// _fcloseall to close all remaining files.
 

#include <stdio.h>

FILE *stream, *stream2;

int main( void )
{
   errno_t err;

   // Open for read (will fail if file "crt_fopen_s.c" does not exist)
   err  = fopen_s( &stream, "crt_fopen_s.c", "r" );
   if( err == 0 )
   {
      printf( "The file 'crt_fopen_s.c' was opened\n" );
   }
   else
   {
      printf( "The file 'crt_fopen_s.c' was not opened\n" );
   }

   // Open for write 
   err = fopen_s( &stream2, "data2", "w+" );
   if( err == 0 )
   {
      printf( "The file 'data2' was opened\n" );
   }
   else
   {
      printf( "The file 'data2' was not opened\n" );
   }

   // Close stream if it is not NULL 
   if( stream )
   {
      err = fclose( stream );
      if ( err == 0 )
      {
         printf( "The file 'crt_fopen_s.c' was closed\n" );
      }
      else
      {
         printf( "The file 'crt_fopen_s.c' was not closed\n" );
      }
   }

   // All other files are closed:
   int numclosed = _fcloseall( );
   printf( "Number of files closed by _fcloseall: %u\n", numclosed );
}
  

Equivalente .NET Framework

Vedere anche

Riferimenti

I/O di flusso

fclose, _fcloseall

_fdopen, _wfdopen

ferror

_fileno

freopen, _wfreopen

_open, _wopen

_setmode