Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
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:
-
Tkerü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. -
Da lemezre írt normál fájlt adja meg. A különbség az, hogy a rendszer automatikusan törli, amikor bezárja. ATDkombiná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