fopen_s
, _wfopen_s
Apre un file. Queste versioni di hanno _wfopen
miglioramenti perfopen
la sicurezza, come descritto in Funzionalità di sicurezza in CRT.
Sintassi
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
pFile
Puntatore al puntatore al file che riceve il puntatore al file aperto.
filename
Nome del file da aprire.
mode
Tipo di accesso consentito.
Valore restituito
Zero se con esito positivo; un codice di errore in caso di errore. Per altre informazioni su questi codici di errore, vedere errno
, _doserrno
, _sys_errlist
e _sys_nerr
.
Condizioni di errore
pFile |
filename |
mode |
Valore restituito | Contenuto di pFile |
---|---|---|---|---|
NULL |
qualsiasi | qualsiasi | EINVAL |
non modificato |
qualsiasi | NULL |
qualsiasi | EINVAL |
non modificato |
qualsiasi | qualsiasi | NULL |
EINVAL |
non modificato |
Osservazioni:
Le fopen_s
funzioni e _wfopen_s
non possono aprire un file per la condivisione. Se è necessario condividere il file, usare _fsopen
o _wfsopen
con la costante della modalità di condivisione appropriata, ad esempio usare _SH_DENYNO
per la condivisione di lettura/scrittura.
La fopen_s
funzione apre il file specificato da filename
. _wfopen_s
è una versione a caratteri wide di fopen_s
e gli argomenti da _wfopen_s
usare sono stringhe di caratteri wide. _wfopen_s
e fopen_s
si comportano in modo identico, in caso contrario.
fopen_s
accetta percorsi validi nel file system in corrispondenza del punto di esecuzione. Percorsi UNC e percorsi che coinvolgono le unità di rete mappate vengono accettati da fopen_s
a condizione che il sistema che esegue il codice abbia accesso alla condivisione o a un'unità di rete mappata al momento dell'esecuzione. Quando si creano i percorsi per fopen_s
, non dare per scontato che le unità, i percorsi o le condivisioni di rete saranno disponibili nell'ambiente di esecuzione. È possibile usare barre (/) o barre rovesciata (\) come separatori di directory in un percorso.
Queste funzioni convalidano i relativi parametri. Se pFile
, filename
o mode
è un puntatore Null, queste funzioni generano un'eccezione di parametro non valida, come descritto in Convalida dei parametri.
Controllare sempre il valore restituito per verificare se la funzione ha avuto esito positivo prima di eseguire altre operazioni sul file. Se si verifica un errore, viene restituito il codice di errore e viene impostata la variabile errno
globale. Per altre informazioni, vedereerrno
, _doserrno
, _sys_errlist
e _sys_nerr
.
Per impostazione predefinita, lo stato globale di questa funzione è limitato all'applicazione. Per modificarlo, vedere Stato globale in CRT.
Supporto Unicode
fopen_s
supporta flussi di file di Unicode. Per aprire un file Unicode nuovo o esistente, passare un ccs
flag che specifica la codifica desiderata a fopen_s
, ad esempio:
fopen_s(&fp, "newfile.txt", "w+, ccs=UNICODE");
I valori consentiti del ccs
flag sono UNICODE
, UTF-8
e UTF-16LE
. Se non viene specificato alcun valore per ccs
, fopen_s
usa la codifica ANSI.
Se il file esiste già e viene aperto per la lettura o l'aggiunta, il byte order mark (BOM), se presente nel file, determina la codifica. La codifica dell'indicatore per l'ordine dei byte ha la precedenza sulla codifica specificata dal flag ccs
. La codifica ccs
viene usata solo se nessun indicatore per l'ordine dei byte è presente o il file è nuovo.
Nota
Il rilevamento di indicatori per l'ordine dei byte si applica solo ai file aperti in modalità Unicode (ovvero passando il flag ccs
).
La tabella seguente riepiloga le modalità per i vari ccs
valori di flag assegnati a fopen_s
e per le macchine virtuali nel file.
Codifiche usate in base al ccs
flag e alla distinta base
Flag diccs |
Nessun indicatore ordine byte (o file nuovo) | Indicatore ordine byte (BOM): UTF-8 | Indicatore ordine byte (BOM): UTF-16 |
---|---|---|---|
UNICODE |
UTF-8 |
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 dispongono di un indicatore per l'ordine dei byte scritto automaticamente in tali file.
Se mode
è "a, ccs=UNICODE"
, "a, ccs=UTF-8"
o "a, ccs=UTF-16LE"
, fopen_s
tenta prima di tutto di aprire il file con accesso in lettura e scrittura. Se ha esito positivo, la funzione legge l'indicatore per l'ordine dei byte per determinare la codifica del file. In caso contrario, la funzione usa la codifica predefinita per il file. In entrambi i casi, fopen_s
riapre il file con accesso in sola scrittura. Questo comportamento si applica solo alla modalità, non a+
a a
.
La stringa di caratteri mode
specifica il tipo di accesso richiesto per il file, come illustrato di seguito.
mode |
Accesso |
---|---|
"r" |
Viene aperto per la lettura. Se il file non esiste o non è stato trovato, la fopen_s chiamata non riesce. |
"w" |
Apre un file vuoto per la scrittura. Se il file specificato esiste, il contenuto viene eliminato in modo permanente. |
"a" |
Viene aperto per la scrittura alla fine del file (aggiunta) senza rimuovere il marcatore di fine file (EOF) prima che nuovi dati vengano scritti sul file. Creare 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 esiste, il contenuto viene eliminato in modo permanente. |
"a+" |
Viene aperto per la lettura e l'aggiunta. L'operazione di aggiunta comporta la rimozione del marcatore di EOF prima che nuovi dati vengano scritti sul file. L'indicatore EOF non viene ripristinato al termine della scrittura. Creare il file se non esiste. |
Quando un file viene aperto con il tipo di accesso "a"
o "a+"
, tutte le operazioni di scrittura vengono eseguite alla fine del file. Il puntatore del file può essere riposizionato usando fseek
o rewind
, ma viene sempre spostato di nuovo alla fine del file prima che venga eseguita un'operazione di scrittura in modo che i dati esistenti non possano essere sovrascritti.
La "a"
modalità non rimuove il marcatore EOF prima dell'aggiunta al file. Dopo l'accodamento, il comando MS-DOS TYPE
visualizza solo i dati fino al marcatore EOF originale e non i dati aggiunti al file. La modalità "a+"
rimuove il marcatore EOF prima di aggiungere il file. Dopo l'aggiunta, il comando MS-DOS TYPE
mostra tutti i dati nel file. La "a+"
modalità è necessaria per l'aggiunta a un file di flusso terminato con l'indicatoreCTRL
+ Z EOF.
Quando si specifica il tipo di accesso , "w+"
o "a+"
, sono consentite sia la "r+"
lettura che la scrittura. (Si dice che il file sia aperto per "update".) Tuttavia, quando si passa dalla lettura alla scrittura, l'operazione di input deve venire attraverso un marcatore EOF. Se non è presente alcun marcatore EOF, è necessario usare una chiamata di intervento a una funzione di posizionamento dei file. Le funzioni di posizionamento di file sono fsetpos
, fseek
e rewind
. Quando si passa dalla scrittura alla lettura, è necessario usare una nuova chiamata a fflush
o a una funzione di posizionamento di file.
A partire da C11, è possibile accodare "x"
o "w"
"w+"
per causare un errore della funzione se il file esiste, anziché sovrascriverlo.
Oltre ai valori precedenti, è possibile includere i caratteri seguenti in mode
per specificare la modalità di conversione per i caratteri di nuova riga:
Modificatore mode |
Modalità di traduzione |
---|---|
t |
Aprire in modalità testo (convertita). Le combinazioni di avanzamento riga ritorno a capo (CR-LF) vengono convertite in feed a riga singola (LF) in caratteri di input e LF vengono convertite in combinazioni CR-LF nell'output. CTRL+Z viene interpretato come carattere di fine file all'input. |
b |
Apri in modalità binaria (non tradotta); le traduzioni che coinvolgono caratteri ritorno a capo e avanzamento riga vengono eliminate. |
In modalità CTRL
+testo (tradotto), Z viene interpretato come carattere di fine file all'input. Per i file aperti per la lettura/scrittura con "a+"
, fopen_s
verifica la presenza di una+CTRL
Z alla fine del file e la rimuove, se possibile. Viene rimosso perché l'uso fseek
e ftell
lo spostamento all'interno di un file che termina con una CTRL
+Z, può causare fseek
un comportamento non corretto vicino alla fine del file.
Inoltre, in modalità testo, le combinazioni ritorno a capo/avanzamento riga (CRLF) vengono convertite in caratteri LF (Single Line Feed) all'input e I caratteri LF vengono convertiti in combinazioni CRLF nell'output. Quando una funzione Unicode di I/O flusso viene eseguita in modalità testo (impostazione predefinita), si presuppone che il flusso di origine o di destinazione sia una sequenza di caratteri multibyte. Le funzioni di input del flusso Unicode converte i caratteri multibyte in caratteri wide (come se fosse una chiamata alla mbtowc
funzione). Per qualche motivo, le funzioni Unicode di output flusso convertono i caratteri "wide" in caratteri multibyte, come se fosse una chiamata alla funzione wctomb
.
Se t
o b
non viene specificato in mode
, la modalità di conversione predefinita viene definita dalla variabile _fmode
globale . Se t
o b
è il prefisso dell'argomento, la funzione ha esito negativo e restituisce NULL
.
Per altre informazioni sull'uso di modalità testo e binaria in I/O di flusso Unicode e multibyte, vedere I/O di file in modalità testo e binario e I/O del flusso Unicode in modalità testo e binario.
Modificatore mode |
Comportamento |
---|---|
c |
Abilitare il flag commit per filename associato, in modo da scrivere il contenuto del buffer di file direttamente su disco se viene chiamato fflush o _flushall . |
n |
Reimpostare il flag di commit per l'oggetto associato filename a "no-commit". Questo flag è il valore predefinito. Esegue anche l'override del flag di commit globale se si collega il programma a COMMODE.OBJ . Il flag di commit globale predefinito è "no-commit", a meno che non si collega esplicitamente il programma con COMMODE.OBJ (vedere Opzioni di collegamento). |
N |
Specifica che il file non viene ereditato dai processi figlio. |
S |
Specifica che la memorizzazione nella cache è ottimizzata, ma non limitata, per l'accesso sequenziale dal disco. |
R |
Specifica che la memorizzazione nella cache è ottimizzata, ma non limitata, per l'accesso casuale dal disco. |
T |
Specifica un file che non viene scritto su disco a meno che non sia richiesto un utilizzo elevato di memoria. |
D |
Specifica un file temporaneo eliminato quando viene chiuso l'ultimo puntatore al file. |
ccs=UNICODE |
Specifica UNICODE come set di caratteri codificati da utilizzare per questo file. Lasciare non specificato se si vuole la codifica ANSI. |
ccs=UTF-8 |
Specifica UTF-8 come set di caratteri codificati da usare per questo file. Lasciare non specificato se si vuole la codifica ANSI. |
ccs=UTF-16LE |
Specifica UTF-16LE come set di caratteri codificati da usare per questo file. Lasciare non specificato se si vuole la codifica ANSI. |
I caratteri validi per la mode
stringa usata in e _fdopen
corrispondono agli oflag
argomenti usati in fopen_s
_open
e _sopen
, come indicato di seguito.
Caratteri nella stringa mode |
Valore oflag equivalente 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 (tradotto) |
c |
None |
n |
None |
D |
_O_TEMPORARY |
R |
_O_RANDOM |
S |
_O_SEQUENTIAL |
T |
_O_SHORTLIVED |
ccs=UNICODE |
_O_WTEXT |
ccs=UTF-8 |
_O_UTF8 |
ccs=UTF-16LE |
_O_UTF16 |
Le c
opzioni , R
n
, S
t
, T
e D
mode
sono estensioni Microsoft per fopen_s
e _wfopen_s
non devono essere usate quando si vuole la portabilità ANSI.
Se usi rb
la modalità, i file Win32 mappati alla memoria potrebbero anche essere un'opzione se non devi convertire il codice, prevedi di leggere gran parte del file o non ti interessa le prestazioni di rete.
Informazioni su T
e D
:
T
evita di scrivere il file su disco, purché non sia necessaria una pressione di memoria. Per altre informazioni, vedereFILE_ATTRIBUTE_TEMPORARY
in Costanti attributo file e anche questo post di blog È solo temporaneo.D
specifica un file normale scritto su disco. La differenza è che viene eliminata automaticamente quando viene chiusa. È possibile combinareTD
per ottenere entrambe le semantiche.
Requisiti
Funzione | Intestazione obbligatoria | Intestazione C++ |
---|---|---|
fopen_s |
<stdio.h> |
<cstdio> |
_wfopen_s |
<stdio.h> oppure <wchar.h> |
<cstdio> |
Per altre informazioni sulla conformità degli standard e sulle convenzioni di denominazione nella libreria di runtime C, vedere Compatibilità.
Mapping di routine di testo generico
<tchar.h> routine |
_UNICODE e _MBCS non definito |
_MBCS definito |
_UNICODE definito |
---|---|---|---|
_tfopen_s |
fopen_s |
fopen_s |
_wfopen_s |
Librerie
Tutte le versioni delle librerie di runtime C.
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" doesn't 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+, ccs=UTF-8" );
if( err == 0 )
{
printf( "The file 'data2' was opened\n" );
}
else
{
printf( "The file 'data2' was not opened\n" );
}
// Close stream if it isn't 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 );
}
The file 'crt_fopen_s.c' was opened
The file 'data2' was opened
Number of files closed by _fcloseall: 1
Vedi anche
I/O di flusso
fclose
, _fcloseall
_fdopen
, _wfdopen
ferror
_fileno
freopen
, _wfreopen
_open
, _wopen
_setmode