Delen via


fopen, _wfopen

Hiermee opent u een bestand. Veiligere versies van deze functies die meer parametervalidatie uitvoeren en foutcodes retourneren zijn beschikbaar; zie fopen_s, _wfopen_s.

Syntaxis

FILE *fopen(
   const char *filename,
   const char *mode
);
FILE *_wfopen(
   const wchar_t *filename,
   const wchar_t *mode
);

Parameterwaarden

filename
Bestandsnaam.

mode
Soort toegang dat is ingeschakeld.

Retourwaarde

Elk van deze functies retourneert een aanwijzer naar het geopende bestand. Een null-aanwijzerwaarde geeft een fout aan. Als filename of mode is NULL of een lege tekenreeks, activeren deze functies de ongeldige parameterhandler, die wordt beschreven in parametervalidatie. Als de uitvoering mag worden voortgezet, retourneren deze functies NULL en stellen ze errno in op EINVAL.

Zie errno, _doserrno, _sys_errlisten _sys_nerrvoor meer informatie.

Opmerkingen

Met de functie fopen wordt het bestand geopend dat is opgegeven door filename. Standaard wordt een smalle filename tekenreeks geïnterpreteerd met behulp van de ANSI-codepagina (CP_ACP). In Windows-bureaubladtoepassingen kan deze worden gewijzigd in de OEM-codepagina (CP_OEMCP) met behulp van de functie SetFileApisToOEM. U kunt de functie AreFileApisANSI gebruiken om te bepalen of filename wordt geïnterpreteerd met behulp van de ANSI of de standaard OEM-codepagina van het systeem. _wfopen is een uitgebreide versie van fopen; de _wfopen argumenten zijn tekenreeksen met een breed teken. Anders gedragen _wfopen en fopen zich identiek. Het gebruik van _wfopen heeft geen invloed op de gecodeerde tekenset die in de bestandsstroom wordt gebruikt.

fopen accepteert paden die geldig zijn in het bestandssysteem op het moment van uitvoering; fopen accepteert UNC-paden en -paden die betrekking hebben op toegewezen netwerkstations zolang het systeem dat de code uitvoert, toegang heeft tot het share- of toegewezen station op het moment van uitvoering. Wanneer u paden voor fopenmaakt, moet u ervoor zorgen dat stations, paden of netwerkshares beschikbaar zijn in de uitvoeringsomgeving. U kunt slashes (/) of backslashes (\) gebruiken als de adreslijstscheidingstekens in een pad.

Controleer altijd de retourwaarde om te zien of de aanwijzer NULL is voordat u andere bewerkingen op het bestand uitvoert. Als er een fout optreedt, wordt de globale variabele errno ingesteld en kan worden gebruikt om specifieke foutinformatie te verkrijgen. Zie errno, _doserrno, _sys_errlisten _sys_nerrvoor 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 ondersteunt Unicode-bestandsstromen. Als u een Unicode-bestand wilt openen, geeft u als volgt een ccs=encoding vlag door die de gewenste codering aan fopenopgeeft.

FILE *fp = fopen("newfile.txt", "rt+, ccs=UTF-8");

Toegestane waarden voor ccs codering zijn UNICODE, UTF-8en UTF-16LE.

Wanneer een bestand wordt geopend in de Unicode-modus, vertalen invoerfuncties de gegevens die uit het bestand worden gelezen in UTF-16-gegevens die zijn opgeslagen als type wchar_t. Functies die schrijven naar een bestand dat is geopend in de Unicode-modus, verwachten buffers die UTF-16-gegevens bevatten die zijn opgeslagen als type wchar_t. Als het bestand is gecodeerd als UTF-8, worden UTF-16-gegevens omgezet in UTF-8 wanneer het wordt geschreven. De UTF-8-gecodeerde inhoud van het bestand wordt omgezet in UTF-16 wanneer deze wordt gelezen. Een poging om een oneven aantal bytes in de Unicode-modus te lezen of schrijven, veroorzaakt een parametervalidatie fout. Als u gegevens wilt lezen of schrijven die zijn opgeslagen in uw programma als UTF-8, gebruikt u een tekst- of binaire bestandsmodus in plaats van een Unicode-modus. U bent verantwoordelijk voor elke vereiste coderingsvertaling.

Als het bestand al bestaat en is geopend voor lezen of toevoegen, bepaalt een bytevolgordemarkering (BOM) 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 bom aanwezig is of het bestand een nieuw bestand is.

Notitie

BOMdetectie is alleen van toepassing op bestanden die zijn geopend in de Unicode-modus (dat wil gezegd door de vlag ccs door te geven).

De volgende tabel bevat een overzicht van de modi die worden gebruikt voor verschillende ccs vlaggen die worden gegeven aan fopen en bytevolgordemarkeringen 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-16LE UTF-8 UTF-16LE
UTF-8 UTF-8 UTF-8 UTF-16LE
UTF-16LE UTF-16LE UTF-8 UTF-16LE

Bestanden die zijn geopend voor schrijven in de Unicode-modus, hebben automatisch een stuklijst geschreven.

Als mode is a, ccs=encoding voor een bepaalde waarde van encoding, probeert fopen eerst het bestand te openen met zowel lees- als schrijftoegang. Als deze actie slaagt, leest de functie de bom om de codering voor het bestand te bepalen. Als dit mislukt, gebruikt de functie de standaardcodering voor het bestand. In beide gevallen opent fopen het bestand opnieuw met alleen-schrijventoegang. (Dit gedrag geldt alleen voor "a" modus, niet voor "a+" modus.)

Algemene routinetoewijzingen voor tekst

TCHAR.H routine _UNICODE en _MBCS niet gedefinieerd _MBCS gedefinieerd _UNICODE gedefinieerd
_tfopen fopen fopen _wfopen

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 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" toegangstype of het "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. Daarom kunnen bestaande gegevens niet worden overschreven.

De "a" modus verwijdert de EOF-markering niet voordat deze aan het bestand wordt toegevoegd. 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. Voordat het aan het bestand wordt toegevoegd, verwijdert de "a+"-modus de EOF-markering. Nadat u de opdracht MS-DOS TYPE hebt toegevoegd, worden 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 het "r+", "w+"of "a+" toegangstype is opgegeven, worden zowel lezen als schrijven ingeschakeld (het bestand wordt geopend voor 'update'). Wanneer u echter overschakelt van lezen naar schrijven, moet de invoerbewerking een EOF-markering tegenkomen. Als er geen EOF is, moet u een tussenliggende aanroep naar een bestandspositiefunctie gebruiken. De functies voor bestandspositionering zijn fsetpos, fseeken rewind. Wanneer u overschakelt van schrijven naar lezen, moet u een tussenliggende aanroep gebruiken naar fflush of naar een functie voor het positioneren van bestanden.

Naast de eerdere waarden kunnen de volgende tekens worden toegevoegd aan mode om de vertaalmodus voor nieuwe regeltekens 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 ook geïnterpreteerd als een eindbestandsteken bij invoer.
b Openen in binaire (niet-vertaalde) modus; vertalingen met regelterugloop- en regelinvoertekens worden onderdrukt.

In de tekstmodus wordt CTRL+Z- geïnterpreteerd als een EOF-teken bij invoer. In bestanden die zijn geopend voor lezen/schrijven met behulp van "a+", fopen controleert op een CTRL+Z- aan het einde van het bestand en verwijdert het, indien mogelijk. Het wordt verwijderd omdat het gebruik van fseek en ftell om te verplaatsen binnen een bestand dat eindigt op CTRL+Z ertoe kan leiden dat fseek zich onjuist gedraagt aan het einde van het bestand.

In de tekstmodus worden crlf-combinaties (regelterugloopfeed) omgezet in LF-tekens (single line feed) op 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. Daarom converteren de Unicode-stroominvoerfuncties 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 NULLgeretourneerd.

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.

De volgende opties kunnen worden toegevoegd aan mode om meer gedrag op te geven.

mode Modifier Gedrag
x Hiermee wordt de functie gedwongen te mislukken als filename al bestaat. Kan alleen worden gebruikt met de aanduidingen 'w' of 'w+'.
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 algemene doorvoermarkering is standaard '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 aanwijzer naar het bestand wordt gesloten.
ccs=encoding Hiermee geeft u de gecodeerde tekenset op die moet worden gebruikt (een van UTF-8, UTF-16LEof UNICODE) voor dit bestand. Laat niet opgegeven als u ANSI-codering wilt. Deze vlag wordt gescheiden van vlaggen die eraan voorafgaan door een komma (,). Bijvoorbeeld: FILE *f = fopen("newfile.txt", "rt+, ccs=UTF-8");

Geldige tekens voor de mode tekenreeks die wordt gebruikt in fopen 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)
x _O_EXCL
c Geen
n Geen
N _O_NOINHERIT
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

Als u de modus rb gebruikt, hoeft u uw code niet over te zetten en als u verwacht dat u het grootste deel van een groot bestand leest of zich geen zorgen maakt over de netwerkprestaties, kunt u ook overwegen of u geheugen toegewezen Win32-bestanden als optie wilt gebruiken.

Met betrekking tot T en D:

  • T vermijdt het schrijven van het bestand naar schijf zolang geheugendruk dit niet vereist. Zie FILE_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 kunt TD combineren om beide semantiek te verkrijgen.

De c, n, R, S, t, Ten Dmode opties zijn Microsoft-extensies voor fopen en _wfopen en mogen niet worden gebruikt wanneer u ANSI-draagbaarheid wilt.

Vereisten

Functie Vereiste header
fopen <stdio.h>
_wfopen <stdio.h> of <wchar.h>

_wfopen is een Microsoft-extensie. Zie Compatibiliteitsvoor meer informatie over compatibiliteit.

De c, n, t, S, R, Ten Dmode opties zijn Microsoft-extensies voor fopen en _fdopen en mogen niet worden gebruikt wanneer ANSI-draagbaarheid gewenst is.

Voorbeeld 1

Het volgende programma opent twee bestanden. Het maakt gebruik van fclose om het eerste bestand te sluiten en _fcloseall alle resterende bestanden te sluiten.

// crt_fopen.c
// compile with: /W3
// 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 )
{
   int numclosed;

   // Open for read (will fail if file "crt_fopen.c" does not exist)
   if( (stream  = fopen( "crt_fopen.c", "r" )) == NULL ) // C4996
   // Note: fopen is deprecated; consider using fopen_s instead
      printf( "The file 'crt_fopen.c' was not opened\n" );
   else
      printf( "The file 'crt_fopen.c' was opened\n" );

   // Open for write
   if( (stream2 = fopen( "data2", "w+" )) == NULL ) // C4996
      printf( "The file 'data2' was not opened\n" );
   else
      printf( "The file 'data2' was opened\n" );

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

   // All other files are closed:
   numclosed = _fcloseall( );
   printf( "Number of files closed by _fcloseall: %u\n", numclosed );
}
The file 'crt_fopen.c' was opened
The file 'data2' was opened
Number of files closed by _fcloseall: 1

Voorbeeld 2

Het volgende programma maakt een bestand (of overschrijft een bestand als het bestaat), in de tekstmodus met Unicode-codering. Vervolgens worden twee tekenreeksen naar het bestand geschreven en wordt het bestand gesloten. De uitvoer is een bestand met de naam _wfopen_test.xml, dat de gegevens uit de uitvoersectie bevat.

// crt__wfopen.c
// compile with: /W3
// This program creates a file (or overwrites one if
// it exists), in text mode using Unicode encoding.
// It then writes two strings into the file
// and then closes the file.

#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <wchar.h>

#define BUFFER_SIZE 50

int main(int argc, char** argv)
{
    wchar_t str[BUFFER_SIZE];
    size_t  strSize;
    FILE*   fileHandle;

    // Create an the xml file in text and Unicode encoding mode.
    if ((fileHandle = _wfopen( L"_wfopen_test.xml",L"wt+,ccs=UNICODE")) == NULL) // C4996
    // Note: _wfopen is deprecated; consider using _wfopen_s instead
    {
        wprintf(L"_wfopen failed!\n");
        return(0);
    }

    // Write a string into the file.
    wcscpy_s(str, sizeof(str)/sizeof(wchar_t), L"<xmlTag>\n");
    strSize = wcslen(str);
    if (fwrite(str, sizeof(wchar_t), strSize, fileHandle) != strSize)
    {
        wprintf(L"fwrite failed!\n");
    }

    // Write a string into the file.
    wcscpy_s(str, sizeof(str)/sizeof(wchar_t), L"</xmlTag>");
    strSize = wcslen(str);
    if (fwrite(str, sizeof(wchar_t), strSize, fileHandle) != strSize)
    {
        wprintf(L"fwrite failed!\n");
    }

    // Close the file.
    if (fclose(fileHandle))
    {
        wprintf(L"fclose failed!\n");
    }
    return 0;
}

Zie ook

Stream I/O-
interpretatie van reeksen met meerdere tekens
fclose, _fcloseall
_fdopen, _wfdopen
ferror
_fileno
freopen, _wfreopen
_open, _wopen
_setmode
_sopen, _wsopen