fopen_s
, _wfopen_s
Hiermee opent u een bestand. Deze versies van fopen
, _wfopen
hebben beveiligingsverbeteringen, zoals beschreven in Beveiligingsfuncties in de CRT-.
Syntaxis
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
);
Parameterwaarden
pFile
Een aanwijzer naar de bestandswijzer die de aanwijzer ontvangt naar het geopende bestand.
filename
De naam van het bestand dat moet worden geopend.
mode
Het type toegang is toegestaan.
Retourwaarde
Nul indien geslaagd; een foutcode bij fout. Zie errno
, _doserrno
, _sys_errlist
en _sys_nerr
voor meer informatie over deze foutcodes.
Foutvoorwaarden
pFile |
filename |
mode |
Retourwaarde | Inhoud van pFile |
---|---|---|---|---|
NULL |
enig | enig | EINVAL |
ongewijzigd |
enig | NULL |
enig | EINVAL |
ongewijzigd |
enig | enig | NULL |
EINVAL |
ongewijzigd |
Opmerkingen
De functies fopen_s
en _wfopen_s
kunnen geen bestand openen voor delen. Als u het bestand wilt delen, gebruikt u _fsopen
of _wfsopen
met de juiste constante voor delen. Gebruik bijvoorbeeld _SH_DENYNO
voor het delen van lees-/schrijfbewerkingen.
Met de functie fopen_s
wordt het bestand geopend dat is opgegeven door filename
.
_wfopen_s
is een uitgebreide versie van fopen_s
en de argumenten voor _wfopen_s
tekenreeksen zijn breedtekenreeksen.
_wfopen_s
en fopen_s
zich identiek gedragen, anders.
fopen_s
accepteert paden die geldig zijn in het bestandssysteem op het moment van uitvoering; UNC-paden en -paden die betrekking hebben op toegewezen netwerkstations worden geaccepteerd door fopen_s
zolang het systeem dat de code uitvoert, toegang heeft tot het gedeelde of toegewezen netwerkstation op het moment van uitvoering. Wanneer u paden voor fopen_s
maakt, maakt u geen veronderstellingen over de beschikbaarheid van stations, paden of netwerkshares in de uitvoeringsomgeving. U kunt slashes (/) of backslashes (\) gebruiken als de adreslijstscheidingstekens in een pad.
Deze functies valideren hun parameters. Als pFile
, filename
of mode
een null-aanwijzer is, genereren deze functies een ongeldige parameter-uitzondering, zoals beschreven in parametervalidatie.
Controleer altijd de retourwaarde om te zien of de functie is geslaagd voordat u verdere bewerkingen op het bestand uitvoert. Als er een fout optreedt, wordt de foutcode geretourneerd en wordt de globale variabele errno
ingesteld. Zie errno
, _doserrno
, _sys_errlist
en _sys_nerr
voor meer informatie.
De globale status van deze functie is standaard gericht op de toepassing. Zie Globale status in de CRT-om deze te wijzigen.
Unicode-ondersteuning
fopen_s
ondersteunt Unicode-bestandsstromen. Als u een nieuw of bestaand Unicode-bestand wilt openen, geeft u een ccs
vlag door die de gewenste codering opgeeft aan fopen_s
, bijvoorbeeld:
fopen_s(&fp, "newfile.txt", "w+, ccs=UNICODE");
Toegestane waarden van de vlag ccs
zijn UNICODE
, UTF-8
en UTF-16LE
. Als er geen waarde is opgegeven voor ccs
, gebruikt fopen_s
ANSI-codering.
Als het bestand al bestaat en wordt geopend voor lezen of toevoegen, bepaalt de bytevolgordemarkering (BOM), indien aanwezig in het bestand, de codering. De bomcodering heeft voorrang op de codering die is opgegeven door de vlag ccs
. De ccs
codering wordt alleen gebruikt wanneer er geen stuklijst aanwezig is of als het bestand een nieuw bestand is.
Notitie
BOM-detectie is alleen van toepassing op bestanden die zijn geopend in unicode-modus; Dat wil gezegd, door de ccs
vlag door te geven.
De volgende tabel bevat een overzicht van de modi voor verschillende ccs
vlagwaarden die worden gegeven aan fopen_s
en voor BOM's in het bestand.
Coderingen die worden gebruikt op basis van ccs
vlag en bom
ccs vlag |
Geen bom (of nieuw bestand) | BOM: UTF-8 | 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 |
Bestanden die worden geopend voor schrijven in de Unicode-modus, hebben automatisch een stuklijst naar deze bestanden geschreven.
Als mode
is "a, ccs=UNICODE"
, "a, ccs=UTF-8"
of "a, ccs=UTF-16LE"
, probeert fopen_s
eerst het bestand te openen met zowel leestoegang als schrijftoegang. Als dit lukt, leest de functie de bom om de codering voor het bestand te bepalen; als dit niet lukt, gebruikt de functie de standaardcodering voor het bestand. In beide gevallen opent fopen_s
het bestand vervolgens opnieuw met alleen-schrijventoegang. (Dit gedrag geldt alleen voor a
modus, niet a+
.)
De tekenreeks mode
geeft als volgt het type toegang op dat voor het bestand wordt aangevraagd.
mode |
Toegang |
---|---|
"r" |
Wordt geopend voor lezen. Als het bestand niet bestaat of niet kan worden gevonden, mislukt de fopen_s aanroep. |
"w" |
Hiermee opent u een leeg bestand voor schrijven. Als het opgegeven bestand bestaat, wordt de inhoud ervan vernietigd. |
"a" |
Wordt geopend voor schrijven aan het einde van het bestand (toevoegen) zonder de EOF-markering (end-of-file) te verwijderen voordat nieuwe gegevens naar het bestand worden geschreven. Hiermee maakt u het bestand als het niet bestaat. |
"r+" |
Wordt geopend voor zowel lezen als schrijven. Het bestand moet bestaan. |
"w+" |
Hiermee opent u een leeg bestand voor zowel lezen als schrijven. Als het bestand bestaat, wordt de inhoud ervan vernietigd. |
"a+" |
Wordt geopend voor lezen en toevoegen. De toevoegbewerking omvat het verwijderen van de EOF-markering voordat nieuwe gegevens naar het bestand worden geschreven. De EOF-markering wordt niet hersteld nadat het schrijven is voltooid. Hiermee maakt u het bestand als het niet bestaat. |
Wanneer een bestand wordt geopend met behulp van het "a"
of "a+"
toegangstype, vinden alle schrijfbewerkingen plaats aan het einde van het bestand. De bestandspointer kan worden verplaatst met behulp van fseek
of rewind
, maar wordt altijd teruggezet naar het einde van het bestand voordat een schrijfbewerking wordt uitgevoerd, zodat bestaande gegevens niet kunnen worden overschreven.
De "a"
modus verwijdert de EOF-markering niet voordat u het bestand toevoegt. Nadat het toevoegen is opgetreden, worden met de opdracht MS-DOS TYPE
alleen gegevens weergegeven tot de oorspronkelijke EOF-markering en geen gegevens die aan het bestand zijn toegevoegd. De "a+"
-modus verwijdert de EOF-markering voordat u het bestand toevoegt. Na het toevoegen worden met de opdracht MS-DOS TYPE
alle gegevens in het bestand weergegeven. De "a+"
modus is vereist voor het toevoegen aan een stroombestand dat is beëindigd met de markering CTRL
+Z EOF.
Wanneer de "r+"
, "w+"
of "a+"
toegangstype is opgegeven, zijn zowel lezen als schrijven toegestaan. (Het bestand is geopend voor 'update'.) Wanneer u echter overschakelt van lezen naar schrijven, moet de invoerbewerking een EOF-markering tegenkomen. Als er geen EOF-markering is, moet u een tussenliggende aanroep naar een functie voor bestandspositionering gebruiken. De bestandspositioneringsfuncties zijn fsetpos
, fseek
en rewind
. Wanneer u overschakelt van schrijven naar lezen, moet u een tussenliggende aanroep gebruiken naar fflush
of naar een functie voor bestandspositionering.
Vanaf C11 kunt u "x"
toevoegen aan "w"
of "w+"
om de functie te laten mislukken als het bestand bestaat, in plaats van het te overschrijven.
Naast de vorige waarden kunnen de volgende tekens worden opgenomen in mode
om de vertaalmodus voor newlinetekens op te geven:
mode modifier |
Vertaalmodus |
---|---|
t |
Openen in de tekstmodus (vertaald). Combinaties van regelterugloopinvoer (CR-LF) worden omgezet in één regelfeeds (LF) op invoer en LF-tekens worden omgezet in CR-LF combinaties op uitvoer. Ctrl+Z wordt geïnterpreteerd als een teken aan het einde van het bestand bij invoer. |
b |
Openen in binaire (niet-vertaalde) modus; vertalingen met regelterugloop- en regelinvoertekens worden onderdrukt. |
In de tekstmodus (vertaald) wordt CTRL
+Z- geïnterpreteerd als een eindbestandsteken op invoer. Voor bestanden die zijn geopend voor lezen/schrijven met "a+"
, controleert fopen_s
op een CTRL
+Z- aan het einde van het bestand en verwijdert u het, indien mogelijk. Het wordt verwijderd omdat het gebruik van fseek
en ftell
om te verplaatsen binnen een bestand dat eindigt op een CTRL
+Z, ertoe kan leiden dat fseek
zich onjuist gedraagt aan het einde van het bestand.
In de tekstmodus worden crlf-combinaties (regelterugloop/regelinvoer) ook omgezet in LF-tekens (single line feed) voor invoer en worden LF-tekens vertaald naar CRLF-combinaties op uitvoer. Wanneer een Unicode-stream-I/O-functie werkt in de tekstmodus (de standaardinstelling), wordt ervan uitgegaan dat de bron- of doelstroom een reeks multibytetekens is. De Unicode-functies voor stroominvoer converteren multibyte-tekens naar brede tekens (alsof door een aanroep naar de mbtowc
functie). Om dezelfde reden converteren de Unicode-stroomuitvoerfuncties brede tekens naar meerderebyte tekens (alsof door een aanroep naar de functie wctomb
).
Als t
of b
niet wordt gegeven in mode
, wordt de standaardomzettingsmodus gedefinieerd door de globale variabele _fmode
. Als t
of b
wordt voorafgegaan door het argument, mislukt de functie en wordt NULL
geretourneerd.
Zie voor meer informatie over het gebruik van tekst en binaire modi in Unicode en multibyte stream-I/O Text and binary mode file I/O en Unicode stream I/O in tekst- en binaire modi.
mode modifier |
Gedrag |
---|---|
c |
Schakel de doorvoervlag in voor de gekoppelde filename , zodat de inhoud van de bestandsbuffer rechtstreeks naar de schijf wordt geschreven als fflush of _flushall wordt aangeroepen. |
n |
Stel de doorvoervlag voor de bijbehorende filename opnieuw in op 'no-commit'. Deze vlag is de standaardwaarde. De algemene doorvoervlag wordt ook overschreven als u uw programma koppelt aan COMMODE.OBJ . De standaardinstelling voor de algemene doorvoermarkering is 'no-commit', tenzij u uw programma expliciet koppelt aan COMMODE.OBJ (zie Koppelingsopties). |
N |
Hiermee geeft u op dat het bestand niet wordt overgenomen door onderliggende processen. |
S |
Hiermee geeft u op dat caching is geoptimaliseerd voor, maar niet beperkt tot, sequentiële toegang vanaf schijf. |
R |
Hiermee geeft u op dat caching is geoptimaliseerd voor, maar niet beperkt tot, willekeurige toegang vanaf schijf. |
T |
Hiermee geeft u een bestand dat niet naar schijf wordt geschreven, tenzij geheugendruk vereist. |
D |
Hiermee geeft u een tijdelijk bestand dat wordt verwijderd wanneer de laatste bestandswijzer naar het bestand wordt gesloten. |
ccs=UNICODE |
Hiermee geeft u UNICODE op als de gecodeerde tekenset die moet worden gebruikt voor dit bestand. Laat niet opgegeven als u ANSI-codering wilt. |
ccs=UTF-8 |
Hiermee geeft u UTF-8 op als de gecodeerde tekenset die moet worden gebruikt voor dit bestand. Laat niet opgegeven als u ANSI-codering wilt. |
ccs=UTF-16LE |
Hiermee geeft u UTF-16LE op als de gecodeerde tekenset die moet worden gebruikt voor dit bestand. Laat niet opgegeven als u ANSI-codering wilt. |
Geldige tekens voor de mode
tekenreeks die wordt gebruikt in fopen_s
en _fdopen
komen als volgt overeen met oflag
argumenten die worden gebruikt in _open
en _sopen
.
Tekens in mode tekenreeks |
Equivalente oflag waarde voor _open /_sopen |
---|---|
a |
_O_WRONLY | _O_APPEND (meestal _O_WRONLY | _O_CREAT | _O_APPEND ) |
a+ |
_O_RDWR | _O_APPEND (meestal _O_RDWR | _O_APPEND | _O_CREAT ) |
R |
_O_RDONLY |
r+ |
_O_RDWR |
w |
_O_WRONLY (meestal _O_WRONLY | _O_CREAT | _O_TRUNC ) |
w+ |
_O_RDWR (meestal **_O_RDWR | _O_CREAT | _O_TRUNC ) |
b |
_O_BINARY |
t |
_O_TEXT (vertaald) |
c |
Geen |
n |
Geen |
N |
_O_NOINHERIT |
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 |
De c
, n
, R
, S
, t
, T
en D
mode
opties zijn Microsoft-extensies voor fopen_s
en _wfopen_s
en mogen niet worden gebruikt wanneer u ANSI-draagbaarheid wilt.
Als u de rb
-modus gebruikt, zijn geheugen toegewezen Win32-bestanden mogelijk ook een optie als u uw code niet hoeft over te zetten, verwacht u veel van het bestand te lezen, of maakt u zich geen zorgen over de netwerkprestaties.
Met betrekking tot T
en D
:
-
T
vermijdt het schrijven van het bestand naar schijf zolang geheugendruk dit niet vereist. ZieFILE_ATTRIBUTE_TEMPORARY
in Bestandskenmerken constantenen dit blogbericht Het is alleen tijdelijkvoor meer informatie. -
D
geeft een gewoon bestand op dat naar schijf wordt geschreven. Het verschil is dat het automatisch wordt verwijderd wanneer deze wordt gesloten. U kuntTD
combineren om beide semantiek te verkrijgen.
Vereisten
Functie | Vereiste header | C++ koptekst |
---|---|---|
fopen_s |
<stdio.h> |
<cstdio> |
_wfopen_s |
<stdio.h> of <wchar.h> |
<cstdio> |
Zie Compatibiliteits-voor meer informatie over standaardencompatibiliteit en naamconventies in de C-runtimebibliotheek.
Algemene routinetoewijzingen voor tekst
<tchar.h> routine |
_UNICODE en _MBCS niet gedefinieerd |
_MBCS gedefinieerd |
_UNICODE gedefinieerd |
---|---|---|---|
_tfopen_s |
fopen_s |
fopen_s |
_wfopen_s |
Bibliotheken
Alle versies van de C-runtimebibliotheken.
Voorbeeld
// 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
Zie ook
Stream I/O-
fclose
, _fcloseall
_fdopen
, _wfdopen
ferror
_fileno
freopen
, _wfreopen
_open
, _wopen
_setmode