Megosztás:


fopen, _wfopen

Megnyitja a fájlt. Ezek a függvények biztonságosabb verziói érhetők el, amelyek több paraméterérvényesítést és visszatérési hibakódot hajtanak végre; lásd: fopen_s, _wfopen_s.

Szintaxis

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

Paraméterek

filename
Fájlnév.

mode
Az engedélyezett hozzáférés típusa.

Visszaadott érték

Mindegyik függvény egy mutatót ad vissza a megnyitott fájlhoz. A null mutató értéke hibát jelez. Ha filename vagy modeNULL vagy üres sztring, ezek a függvények aktiválják az érvénytelen paraméterkezelőt, amely paraméterérvényesítési. Ha a végrehajtás folytatódik, ezek a függvények NULL ad vissza, és a errnoEINVALértékre állítják.

További információ: errno, _doserrno, _sys_errlistés _sys_nerr.

Megjegyzések

A fopen függvény megnyitja a filenameáltal megadott fájlt. Alapértelmezés szerint a rendszer egy keskeny filename sztringet értelmez az ANSI-kódlap (CP_ACP) használatával. A Windows Desktop-alkalmazásokban a CP_OEMCP függvény használatával az OEM kódlapra (SetFileApisToOEM) módosítható. A AreFileApisANSI függvénnyel megállapíthatja, hogy a filename az ANSI vagy a rendszer alapértelmezett OEM-kódlapja alapján értelmezik-e. _wfopen a fopenszéles karakterű verziója; az _wfopen argumentumok széles karakterű sztringek. Ellenkező esetben _wfopen és fopen ugyanúgy viselkednek. A _wfopen használata nem befolyásolja a fájlstreamben használt kódolt karakterkészletet.

fopen fogadja el azokat az útvonalakat, amelyek a fájlrendszeren a végrehajtás időpontjában érvényesek; fopen a leképezett hálózati meghajtókat tartalmazó UNC-útvonalakat és elérési utakat fogadja el mindaddig, amíg a kódot végrehajtó rendszer hozzáféréssel rendelkezik a megosztási vagy a leképezett meghajtóhoz a végrehajtás időpontjában. A fopenelérési útjainak létrehozásakor győződjön meg arról, hogy a meghajtók, elérési utak vagy hálózati megosztások elérhetők a végrehajtási környezetben. Az elérési út címtárelválasztójaként használhatja a perjeleket (/) vagy a fordított perjeleket (\).

Mindig ellenőrizze a visszatérési értéket, hogy a mutató NULL értékű-e, mielőtt bármilyen más műveletet végrehajt a fájlon. Hiba esetén a errno globális változó be van állítva, és adott hibainformációk lekérésére használható. További információ: errno, _doserrno, _sys_errlistés _sys_nerr.

Alapértelmezés szerint ennek a függvénynek a globális állapota hatóköre az alkalmazásra terjed ki. A módosítást a CRT globális állapotában találhatja meg.

Unicode-támogatás

fopen támogatja a Unicode-fájlstreameket. Unicode-fájl megnyitásához adjon át egy ccs=encoding jelzőt, amely megadja a kívánt kódolást fopen, az alábbiak szerint.

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

A ccs kódolás engedélyezett értékei a UNICODE, a UTF-8és a UTF-16LE.

Ha egy fájl Unicode módban van megnyitva, a bemeneti függvények lefordítják a fájlból beolvasott adatokat UTF-16 típusú wchar_ttárolt adatokká. A Unicode módban megnyitott fájlba író függvények olyan puffereket várnak, amelyek wchar_ttípusként tárolt UTF-16 adatokat tartalmaznak. Ha a fájl UTF-8 kódolású, akkor az UTF-16-adatok le lesznek fordítva UTF-8-ra, amikor meg van írva. A fájl UTF-8 kódolású tartalma olvasáskor UTF-16-ra lesz lefordítva. A Unicode módban páratlan számú bájt olvasására vagy írására tett kísérlet paraméterérvényesítési hibát okoz. A programban UTF-8-ként tárolt adatok olvasásához vagy írásához Unicode-mód helyett szöveg- vagy bináris fájlmódot használjon. Ön a felelős minden szükséges kódolási fordításért.

Ha a fájl már létezik, és olvasásra vagy hozzáfűzésre van megnyitva, akkor a fájl bármely bájtsorrendjele (BOM) meghatározza a kódolást. A BOM kódolás elsőbbséget élvez a ccs jelző által megadott kódolással szemben. A ccs kódolást csak akkor használja a rendszer, ha nincs BOM, vagy a fájl egy új fájl.

Megjegyzés

A BOM-észlelés csak a Unicode módban (azaz a ccs jelző átadásával) megnyitott fájlokra vonatkozik.

Az alábbi táblázat összefoglalja a ccs és a bájtsorrendjelek különböző fopen jelzőihez használt módokat a fájlban.

Ccs-jelző és BOM alapján használt kódolások

ccs jelző Nincs anyagjegyzék (vagy új fájl) 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

A Unicode módban írásra megnyitott fájlokhoz automatikusan meg van írva egy anyagjegyzék.

Ha mode valamilyen a, ccs=encoding értékhez encoding, fopen először olvasási és írási hozzáféréssel próbálja megnyitni a fájlt. Ha ez a művelet sikeres, a függvény beolvassa a BOM-t a fájl kódolásának meghatározásához. Ha nem sikerül, a függvény a fájl alapértelmezett kódolását használja. Mindkét esetben fopen újra megnyitja a fájlt írásvédett hozzáféréssel. (Ez a viselkedés csak "a" módra vonatkozik, "a+" módra nem.)

Általános szöveges rutinleképezések

TCHAR.H rutin _UNICODE és _MBCS nincs definiálva _MBCS definiálva _UNICODE definiálva
_tfopen fopen fopen _wfopen

A mode karaktersztring az alábbiak szerint határozza meg a fájlhoz kért hozzáférést.

mode Hozzáférés
"r" Megnyílik olvasásra. Ha a fájl nem létezik vagy nem található, a fopen hívás meghiúsul.
"w" Üres fájl megnyitása íráshoz. Ha a megadott fájl létezik, annak tartalma megsemmisül.
"a" Megnyílik a fájl végén történő íráshoz (hozzáfűzéshez) anélkül, hogy eltávolítaná a fájl vége (EOF) jelölőt, mielőtt új adatokat ír a fájlba. Létrehozza a fájlt, ha nem létezik.
"r+" Olvasáshoz és íráshoz is megnyílik. A fájlnak léteznie kell.
"w+" Üres fájlt nyit meg olvasáshoz és íráshoz is. Ha a fájl létezik, annak tartalma megsemmisül.
"a+" Megnyílik az olvasáshoz és a hozzáfűzéshez. A hozzáfűzési művelet magában foglalja az EOF-jelölő eltávolítását, mielőtt új adatokat ír a fájlba. Az EOF-jelölő az írás befejezése után nem állítható vissza. Létrehozza a fájlt, ha nem létezik.

Ha egy fájlt a "a" hozzáférési típussal vagy a "a+" hozzáférési típussal nyit meg, minden írási művelet a fájl végén történik. A fájlmutató áthelyezhető fseek vagy rewindhasználatával, de az írási művelet végrehajtása előtt mindig visszakerül a fájl végére. Ezért a meglévő adatok nem írhatók felül.

A "a" mód nem távolítja el az EOF-jelölőt, mielőtt hozzáfűzné a fájlhoz. A hozzáfűzés után a MS-DOS TYPE parancs csak az eredeti EOF-jelölőig jeleníti meg az adatokat, a fájlhoz fűzött adatokat nem. Mielőtt hozzáfűzné a fájlhoz, a "a+" mód eltávolítja az EOF-jelölőt. A hozzáfűzés után a MS-DOS TYPE parancs megjeleníti a fájl összes adatát. A "a+" mód szükséges egy streamfájlhoz való hozzáfűzéshez, amely a CTRL+Z EOF-jelölővel végződik.

Ha a "r+", "w+"vagy "a+" hozzáférési típus meg van adva, az olvasás és az írás is engedélyezve van (a fájl állítólag "frissítésre" van megnyitva). Ha azonban olvasásról írásra vált, a bemeneti műveletnek EOF-jelölővel kell találkoznia. Ha nincs EOF, egy fájlhelyezési függvényhez kell beavatkozó hívást használnia. A fájlhelyezési függvények fsetpos, fseekés rewind. Amikor írásról olvasásra vált, egy beavatkozó hívást kell használnia fflush vagy fájlhelyezési függvényhez.

A korábbi értékek mellett a következő karaktereket is hozzáfűzheti a mode az újsoros karakterek fordítási módjának megadásához.

mode módosító Fordítási mód
t Megnyitás szöveges (lefordított) módban. A kocsivisszameneti (CR-LF) kombinációk bemeneten egysoros hírcsatornákra (LF) vannak lefordítva, az LF karakterek pedig CR-LF kombinációkra lesznek lefordítva a kimeneten. A CTRL+Z billentyűkombinációt a bemeneten fájlvég karakterként értelmezi a rendszer.
b Megnyitás bináris (nem lefordított) módban; a kocsivissza- és vonalbetöltési karaktereket tartalmazó fordítások el lesznek tiltva.

Szöveges módban a CTRL+Z EOF-karakterként értelmezik a bemeneten. A "a+"használatával olvasásra/írásra megnyitott fájlokban fopen ellenőrzi a fájl végén található CTRL+Z, és ha lehetséges, eltávolítja. Ez azért lett eltávolítva, mert fseek és ftell használatával a CTRL+Z végződésű fájlon belülre lépve előfordulhat, hogy fseek helytelenül viselkedik a fájl vége közelében.

Szöveges módban a kocsivisszameneti csatorna (CRLF) kombinációi egysoros hírcsatorna (LF) karakterekké alakulnak a bemeneten, az LF karakterek pedig a kimenet CRLF-kombinációira lesznek lefordítva. Ha egy Unicode stream-I/O függvény szöveges módban működik (az alapértelmezett), a forrás- vagy célstream többbájtos karaktersorozatnak számít. Ezért a Unicode streambemeneti függvények a többbájtos karaktereket széles karakterekké alakítják át (mintha a mbtowc függvény hívásával). Ugyanezen okból a Unicode stream-output függvények a széles karaktereket többbájtos karakterekké alakítják át (mintha a wctomb függvény hívásával).

Ha t vagy b nincs megadva mode, az alapértelmezett fordítási módot a _fmodeglobális változó határozza meg. Ha t vagy b az argumentum előtagja, a függvény meghiúsul, és NULLad vissza.

További információ a szöveges és bináris módok Unicode-ban és többbájtos stream-I/O-ban való használatáról: Szöveges és bináris módú fájl I/O- és Unicode-stream I/O szöveges és bináris módban.

A következő beállításokat hozzáfűzheti a mode további viselkedések megadásához.

mode módosító Magatartás
x A függvény meghiúsulására kényszeríti, ha filename már létezik. Csak a "w" vagy a "w+" kijelölőkkel használható.
c Engedélyezze a társított filename véglegesítési jelzőt, hogy a fájlpuffer tartalma közvetlenül a lemezre legyen írva, ha fflush vagy _flushall van meghívva.
n Állítsa alaphelyzetbe a társított filename véglegesítési jelölőjének "nincs véglegesítés" értékre. Ez az alapértelmezett jelölő. Felülbírálja a globális véglegesítési jelzőt is, ha a programot COMMODE.OBJ csatolja. A globális véglegesítési jelző alapértelmezett értéke a "no-commit" (véglegesítés nélküli) érték, kivéve, ha explicit módon összekapcsolja a programot a COMMODE-jal. OBJ (lásd Hivatkozás beállításai).
N Azt adja meg, hogy a fájlt nem öröklik gyermekfolyamatok.
S Megadja, hogy a gyorsítótárazás a lemezről való szekvenciális hozzáférésre van optimalizálva, de nem korlátozva.
R Azt adja meg, hogy a gyorsítótárazás a lemezről való véletlenszerű hozzáférésre van optimalizálva, de nem korlátozva.
T Olyan fájlt ad meg, amely nincs lemezre írva, kivéve, ha a memóriaterhelés megköveteli.
D Olyan ideiglenes fájlt ad meg, amely az utolsó fájlmutató bezárásakor törlődik.
ccs=encoding Megadja a fájlhoz használni kívánt kódolt karakterkészletet (UTF-8, UTF-16LEvagy UNICODEegyikét). Ha ANSI-kódolást szeretne, hagyja meg nem részletezve. Ez a jelölő vesszővel (,) elválasztva van az előtte található jelölőktől. Például: FILE *f = fopen("newfile.txt", "rt+, ccs=UTF-8");

A mode és fopen használt _fdopen karakterlánc érvényes karakterei az oflag és _open_sopen argumentumoknak felelnek meg az alábbiak szerint.

Karakterek mode sztringben Egyenértékű oflag érték _open/_sopen
a _O_WRONLY | _O_APPEND (általában _O_WRONLY | _O_CREAT | _O_APPEND)
a+ _O_RDWR | _O_APPEND (általában _O_RDWR | _O_APPEND | _O_CREAT)
r _O_RDONLY
r+ _O_RDWR
w _O_WRONLY (általában _O_WRONLY | _O_CREAT | _O_TRUNC)
w+ _O_RDWR (általában _O_RDWR | _O_CREAT | _O_TRUNC)
b _O_BINARY
t _O_TEXT (lefordítva)
x _O_EXCL
c Egyik sem
n Egyik sem
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

Ha rb módot használ, nem kell portolnia a kódot, és ha nagy méretű fájl olvasására számít, vagy nem aggódik a hálózati teljesítmény miatt, megfontolhatja azt is, hogy a memórialeképezett Win32-fájlokat használja-e lehetőségként.

A T és a Dtekintetében:

  • T kerüli a fájl lemezre írását mindaddig, amíg a memóriaterhelés nem igényli. További információ: FILE_ATTRIBUTE_TEMPORARYFájlattribútum-állandók, valamint ez a blogbejegyzés Ez csak ideiglenes.
  • D a lemezre írt normál fájlt adja meg. A különbség az, hogy a rendszer automatikusan törli, amikor bezárja. A TD kombinálva mindkét szemantikát lekérheti.

A c, n, R, S, t, Tés Dmode lehetőségek a Microsoft fopen és _wfopen bővítményei, és nem használhatók az ANSI hordozhatóságához.

Követelmények

Funkció Kötelező fejléc
fopen <stdio.h>
_wfopen <stdio.h> vagy <wchar.h>

_wfopen egy Microsoft-bővítmény. További információ a kompatibilitásról: Kompatibilitási.

A c, n, t, S, R, Tés Dmode lehetőségek a Microsoft fopen és _fdopen bővítményei, és nem használhatók ott, ahol az ANSI hordozhatósága szükséges.

1. példa

A következő program két fájlt nyit meg. Az első fájl bezárásához fclose, a többi fájl bezárásához pedig _fcloseall.

// 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

2. példa

Az alábbi program létrehoz egy fájlt (vagy felülír egyet, ha létezik), Unicode kódolású szöveges módban. Ezután két sztringet ír a fájlba, és bezárja a fájlt. A kimenet egy _wfopen_test.xmlnevű fájl, amely a kimeneti szakasz adatait tartalmazza.

// 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;
}

Lásd még

Stream I/O-
többbájtos karaktersorozatok értelmezése
fclose, _fcloseall
_fdopen, _wfdopen
ferror
_fileno
freopen, _wfreopen
_open, _wopen
_setmode
_sopen, _wsopen