fopen
, _wfopen
Öffnet eine Datei. Sicherere Versionen dieser Funktionen, die mehr Parameterüberprüfung ausführen und Fehlercodes zurückgeben, sind verfügbar; siehe fopen_s
, _wfopen_s
.
Syntax
FILE *fopen(
const char *filename,
const char *mode
);
FILE *_wfopen(
const wchar_t *filename,
const wchar_t *mode
);
Parameter
filename
Dateiname.
mode
Art des Zugriffs, der aktiviert ist.
Rückgabewert
Jede dieser Funktionen gibt einen Zeiger auf die geöffnete Datei zurück. Ein NULL-Zeigerwert gibt einen Fehler an. Wenn filename
oder mode
eine leere Zeichenfolge ist NULL
, lösen diese Funktionen den ungültigen Parameterhandler aus, der in der Parameterüberprüfung beschrieben wird. Wenn die weitere Ausführung zugelassen wird, geben diese Funktionen NULL
zurück und stellen errno
auf EINVAL
ein.
Weitere Informationen finden Sie untererrno
, _doserrno
, _sys_errlist
und _sys_nerr
.
Hinweise
Die fopen
Funktion öffnet die durch filename
. Standardmäßig wird eine schmale filename
Zeichenfolge mithilfe der ANSI-Codepage (CP_ACP
) interpretiert. In Windows-Desktopanwendungen kann sie mithilfe der Funktion auf die SetFileApisToOEM
OEM-Codepage (CP_OEMCP
) geändert werden. Mit der AreFileApisANSI
Funktion können Sie ermitteln, ob filename
sie mithilfe der ANSI oder der standardmäßigen OEM-Codepage des Systems interpretiert wird. _wfopen
ist eine Breitzeichenversion von fopen
; die _wfopen
Argumente sind Zeichenfolgen mit breitem Zeichen. Andernfalls verhalten sich _wfopen
und fopen
identisch. Die Verwendung _wfopen
wirkt sich nicht auf den codierten Zeichensatz aus, der im Dateidatenstrom verwendet wird.
fopen
akzeptiert Pfade, die zum Zeitpunkt der Ausführung im Dateisystem gültig sind. fopen
akzeptiert UNC-Pfade und Pfade mit zugeordneten Netzlaufwerken, solange das System, das den Code ausführt, zum Zeitpunkt der Ausführung Zugriff auf die Freigabe oder das zugeordnete Netzlaufwerk hat. Stellen Sie beim Erstellen von Pfaden sicher fopen
, dass Laufwerke, Pfade oder Netzwerkfreigaben in der Ausführungsumgebung verfügbar sind. Sie können schräge Schrägstriche (/
) oder umgekehrte Schrägstriche (\
) als Verzeichnistrennzeichen in einem Pfad verwenden.
Überprüfen Sie immer den Rückgabewert, um festzustellen, ob der Zeiger NULL ist, bevor Sie andere Vorgänge für die Datei ausführen. Wenn ein Fehler auftritt, wird die globale Variable errno
festgelegt und kann verwendet werden, um bestimmte Fehlerinformationen zu erhalten. Weitere Informationen finden Sie untererrno
, _doserrno
, _sys_errlist
und _sys_nerr
.
Standardmäßig gilt der globale Zustand dieser Funktion für die Anwendung. Informationen zum Ändern finden Sie im Global state in the CRT.
Unicode-Unterstützung
fopen
unterstützt Unicode-Dateistreams. Um eine Unicode-Datei zu öffnen, geben Sie ein ccs=encoding
-Flag, das die gewünschte Codierung angibt, wie folgt an fopen
weiter.
FILE *fp = fopen("newfile.txt", "rt+, ccs=UTF-8");
Zulässige Werte für ccs
die Codierung sind UNICODE
, UTF-8
und UTF-16LE
.
Wenn eine Datei im Unicode-Modus geöffnet wird, übersetzen die Eingabefunktionen die aus der Datei gelesenen Daten in UTF-16-Daten, die als Datentyp wchar_t
gespeichert werden. Funktionen, die in eine im Unicode-Modus geöffnete Datei schreiben, erwarten Puffer, die UTF-16-Daten, die als Datentyp wchar_t
gespeichert sind. Wenn die Datei als UTF-8 codiert ist, werden UTF-16-Daten beim Schreiben in UTF-8 übersetzt. Der UTF-8-codierte Inhalt der Datei wird beim Lesen in UTF-16 übersetzt. Der Versuch, eine ungerade Anzahl von Bytes im Unicode-Modus zu lesen oder zu schreiben, führt zu einem Parametervalidierungsfehler . Wenn Sie Daten lesen oder schreiben möchten, die in Ihrem Programm als UTF-8 gespeichert sind, verwenden Sie den Text- oder Binärdateienmodus anstelle eines Unicode-Modus. Sie sind für alle erforderlichen Codierungsübersetzungen verantwortlich.
Wenn die Datei bereits vorhanden ist und zum Lesen oder Anfügen geöffnet wird, bestimmt eine beliebige Bytereihenfolgemarke (BYTE Order Mark, BOM) in der Datei die Codierung. Die BOM-Codierung hat Vorrang vor der durch das ccs
Flag angegebenen Codierung. Die ccs
-Codierung wird nur verwendet, wenn keine BOM vorhanden ist oder wenn die Datei neu ist.
Hinweis
Die BOM-Erkennung gilt nur für Dateien, die im Unicode-Modus geöffnet sind (das heißt durch Übergeben des ccs
-Flags).
Die folgende Tabelle fasst die Modi zusammen, die für verschiedene ccs
-Flags für fopen
sowie für die Bytereihenfolge-Marken in der Datei verwendet werden.
Auf ccs-Flag und BOM basierende Codierungen
ccs -Flag |
Keine BOM (oder neue Datei) | 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 |
In Dateien, die zum Schreiben im Unicode-Modus geöffnet sind, wird automatisch eine BOM geschrieben.
Wenn mode
es sich um einen encoding
Wert handelta, ccs=encoding
, versucht zuerst, fopen
die Datei mit Lese- und Schreibzugriff zu öffnen. Wenn diese Aktion erfolgreich ist, liest die Funktion die BOM, um die Codierung für die Datei zu bestimmen. Wenn ein Fehler auftritt, verwendet die Funktion die Standardcodierung für die Datei. In beiden Fällen fopen
wird die Datei mit schreibgeschütztem Zugriff erneut geöffnet. (Dieses Verhalten gilt nur für den "a"
Modus, nicht für den "a+"
Modus.)
Mapping generischer Textroutinen
TCHAR.H -Routine |
_UNICODE und _MBCS nicht definiert |
_MBCS definiert |
_UNICODE definiert |
---|---|---|---|
_tfopen |
fopen |
fopen |
_wfopen |
Die Zeichenfolge mode
gibt die Art des Zugriffs, der für die Datei angefordert wird, wie folgt an.
mode |
Access |
---|---|
"r" |
Öffnet zum Lesen. Wenn die Datei nicht vorhanden ist oder nicht gefunden werden kann, schlägt der fopen Aufruf fehl. |
"w" |
Öffnet eine leere Datei zum Schreiben. Wenn die angegebene Datei vorhanden ist, wird ihr Inhalt zerstört. |
"a" |
Wird vor dem Schreiben neuer Daten in die Datei zum Schreiben am Ende der Datei (Anfügen) geöffnet, ohne die EOF-Markierung (end-of-file, Dateiende) zu entfernen. Erstellt die Datei, wenn sie nicht vorhanden ist. |
"r+" |
Öffnet sowohl zum Lesen als auch zum Schreiben. Die Datei muss vorhanden sein. |
"w+" |
Öffnet eine leere Datei zum Lesen und Schreiben. Wenn die Datei vorhanden ist, wird ihr Inhalt zerstört. |
"a+" |
Öffnet sich zum Lesen und Anfügen. Der Anfügevorgang umfasst das Entfernen der EOF-Markierung, bevor neue Daten in die Datei geschrieben werden. Die EOF-Markierung wird nach Abschluss des Schreibens nicht wiederhergestellt. Erstellt die Datei, wenn sie nicht vorhanden ist. |
Bei einer mit dem Zugriffstyp "a"
oder "a+"
geöffneten Datei erfolgen alle Schreibvorgänge am Ende der Datei. Der Dateizeiger kann mit fseek
oder rewind
neu angeordnet werden, er wird jedoch immer wieder zurück an das Ende der Datei verschoben, bevor ein Schreibvorgang durchgeführt wird. Daher können vorhandene Daten nicht überschrieben werden.
Der "a"
Modus entfernt die EOF-Markierung nicht, bevor sie an die Datei angefügt wird. Nach dem Anfügen werden durch den MS-DOS-Befehl TYPE nur Daten bis zur ursprünglichen EOF-Markierung angezeigt, aber keine Daten, die an die Datei angefügt wurden. Bevor sie an die Datei angefügt wird, entfernt der "a+"
-Modus die EOF-Markierung. Nach dem Anhängen werden mit dem Befehl MS-DOS TYPE alle Daten in der Datei angezeigt. Der "a+"
Modus ist für das Anfügen an eine Streamdatei erforderlich, die mit demCTRL
+ Z EOF-Marker beendet wird.
Wenn als Zugriffstyp "r+"
, "w+"
oder "a+"
angegeben wird, sind sowohl Lese- als auch Schreibvorgänge zulässig (die Datei ist zum Aktualisieren geöffnet). Wenn Sie jedoch vom Lesevorgang in den Schreibvorgang wechseln, muss die Eingabeoperation eine EOF-Markierung antreffen. Wenn kein EOF vorhanden ist, müssen Sie einen dazwischen liegenden Aufruf einer Dateipositionierungsfunktion verwenden. Die dateipositionierenden Funktionen sind fsetpos
, fseek
und rewind
. Wenn Sie vom Schreibvorgang in den Lesevorgang wechseln, müssen Sie einen zwischenzeitlichen Aufruf von fflush
oder einer dateipositionierenden Funktion ausführen.
Neben früheren Werte können die folgenden Zeichen an mode
angefügt werden, um den Übersetzungsmodus für Zeilenumbruchzeichen anzugeben.
mode -Modifizierer |
Übersetzungsmodus |
---|---|
t |
Öffnen im Textmodus (übersetzt). Wagenrücklauflinieneinzugskombinationen (CR-LF) werden in einzeilige Feeds (LF) für Eingabe- und LF-Zeichen in CR-LF-Kombinationen für die Ausgabe übersetzt. Außerdem wird STRG+Z bei der Eingabe als EOF-Zeichen interpretiert. |
b |
Im Binärmodus (nicht translatiert) öffnen; Übersetzungen mit Wagenrücklauf- und Zeilenvorschubzeichen werden unterdrückt. |
Im Textmodus CTRL
+wird Z als EOF-Zeichen für die Eingabe interpretiert. In Dateien, die mithilfe von "a+"
Lese-/Schreibvorgängen geöffnet werden, fopen
wird am Ende der Datei nach ZCTRL
+ gesucht und entfernt, sofern dies möglich ist. Sie wird entfernt, da die Verwendung fseek
und ftell
das Verschieben in einer Datei, die mit CTRL
+Z endet, dazu führen fseek
kann, dass sich das Verhalten am Ende der Datei falsch verhält.
Im Textmodus werden Wagenrücklaufeinzugskombinationen (CRLF) in Einfügezeichen (Single Line Feed, LF) für Eingaben übersetzt, und LF-Zeichen werden in CRLF-Kombinationen für die Ausgabe übersetzt. Wenn eine Stream-E/A-Funktion von Unicode im Textmodus (Standard) funktioniert, wird angenommen, dass es sich bei Quell- oder Zielstream um eine Sequenz von Multibytezeichen handelt. Daher konvertieren die Unicode Streameingabefunktionen Multibytezeichen in Breitzeichen (wie bei einem Aufruf der mbtowc
-Funktion). Aus demselben Grund konvertieren die Unicode-Streamausgabefunktionen Breitzeichen in Multibytezeichen (wie bei einem Aufruf der wctomb
-Funktion).
Wenn t
oder b
nicht angegeben mode
wird, wird der Standardübersetzungsmodus durch die globale Variable _fmode
definiert. Wenn dem Argument t
oder b
vorangestellt wird, schlägt die Funktion fehl und gibt NULL
zurück.
Weitere Informationen zur Verwendung von Text- und Binärmodi in Unicode und Multibyte stream-I/O finden Sie unter "Text- und Binärmodusdatei-E/A " und "Unicode-Datenstrom-E/A" im Text- und Binärmodus.
Die folgenden Optionen können angefügt werden, mode
um weitere Verhaltensweisen anzugeben.
mode -Modifizierer |
Behavior |
---|---|
x |
Erzwingt, dass die Funktion fehlschlägt, wenn filename sie bereits vorhanden ist. Kann nur mit den Bezeichnern "w" oder "w+" verwendet werden. |
c |
Aktivieren Sie das Commitflag für den zugeordneten Parameter filename , sodass der Inhalt des Dateipuffers direkt auf einen Datenträger geschrieben wird, wenn fflush oder _flushall aufgerufen wird. |
n |
Setzen Sie das Commit-Flag für das zugeordnete filename "no-commit" zurück. Dieses Kennzeichen ist die Standardeinstellung. Dabei wird auch das globale Commitflag überschrieben, wenn Sie das Programm mit COMMODE.OBJ verknüpfen. Der Standardwert für das globale Commit-Flag lautet "no-commit", es sei denn, Sie verknüpfen Ihr Programm explizit mit COMMODE. OBJ (siehe Linkoptionen). |
N |
Gibt an, dass die Datei nicht von untergeordneten Prozessen geerbt wird. |
S |
Gibt an, dass das Zwischenspeichern für den sequenziellen Zugriff vom Datenträger optimiert, aber nicht darauf beschränkt ist. |
R |
Gibt an, dass das Zwischenspeichern für den zufälligen Zugriff vom Datenträger optimiert, aber nicht darauf beschränkt ist. |
T |
Gibt eine Datei an, die nicht auf den Datenträger geschrieben wird, es sei denn, der Arbeitsspeicherdruck erfordert sie. |
D |
Gibt eine temporäre Datei an, die beim Schließen des letzten Dateizeigers gelöscht wird. |
ccs=encoding |
Gibt den codierten Zeichensatz an, der (einer von UTF-8 , UTF-16LE oder UNICODE ) für diese Datei verwendet werden soll. Machen Sie keine Angabe, wenn Sie ANSI-Codierung wünschen. Diese Kennzeichnung wird von Flags getrennt, die einem Komma (, ) vorangehen. Beispiel: FILE *f = fopen("newfile.txt", "rt+, ccs=UTF-8"); |
Gültige Zeichen für die Zeichenfolge, die mode
verwendet fopen
wird und _fdopen
den oflag
Argumenten entspricht, die in _open
und _sopen
, wie folgt verwendet werden.
Zeichen in der mode -Zeichenfolge |
Der entsprechende oflag -Wert für _open /_sopen |
---|---|
a |
_O_WRONLY | _O_APPEND (meistens _O_WRONLY | _O_CREAT | _O_APPEND ) |
a+ |
_O_RDWR | _O_APPEND (meistens _O_RDWR | _O_APPEND | _O_CREAT ) |
r |
_O_RDONLY |
r+ |
_O_RDWR |
w |
_O_WRONLY (meistens _O_WRONLY | _O_CREAT | _O_TRUNC ) |
w+ |
_O_RDWR (meistens _O_RDWR | _O_CREAT | _O_TRUNC ) |
b |
_O_BINARY |
t |
_O_TEXT (übersetzt) |
x |
_O_EXCL |
c |
Keine |
n |
Keine |
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 |
Wenn Sie den Modus verwenden rb
, müssen Sie Ihren Code nicht portieren. Wenn Sie davon ausgehen, dass sie die meisten großen Dateien lesen oder sich nicht um die Netzwerkleistung kümmern, können Sie auch überlegen, ob Sie win32-Dateien als Option verwenden möchten.
Bezüglich T
und D
:
T
verhindert, dass die Datei auf den Datenträger geschrieben wird, solange kein Arbeitsspeicherdruck erforderlich ist. Weitere Informationen finden Sie inFILE_ATTRIBUTE_TEMPORARY
Datei-Attributkonstanten und auch in diesem Blogbeitrag Es ist nur temporär.D
Gibt eine normale Datei an, die auf den Datenträger geschrieben wird. Der Unterschied besteht darin, dass sie beim Schließen automatisch gelöscht wird. Sie können kombinierenTD
, um beide Semantik abzurufen.
Die c
, n
, , S
R
, t
, T
D
mode
und Optionen sind Microsoft-Erweiterungen für fopen
und _wfopen
sollten nicht verwendet werden, wenn Sie ANSI-Portabilität wünschen.
Anforderungen
Funktion | Erforderlicher Header |
---|---|
fopen |
<stdio.h> |
_wfopen |
<stdio.h> oder <wchar.h> |
_wfopen
ist eine Microsoft-Erweiterung. Weitere Informationen zur Kompatibilität finden Sie unter Kompatibilität.
Die Microsoft-Erweiterungen S
R
D
n
T
mode
t
und -Optionen sind die c
Microsoft-Erweiterungen fopen
und _fdopen
sollten nicht verwendet werden, wenn die ANSI-Portabilität gewünscht wird.
Beispiel 1
Das folgende Programm öffnet zwei Dateien. Es verwendet fclose
, um die erste Datei zu schließen, und _fcloseall
, um alle übrigen Dateien zu schließen.
// 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
Beispiel 2
Das folgende Programm erstellt eine Datei (oder überschreibt eine, sofern vorhanden) im Textmodus mit Unicode-Codierung. Anschließend schreibt es zwei Zeichenfolgen in die Datei und schließt sie. Die Ausgabe ist eine Datei mit dem Namen _wfopen_test.xml
, die die Daten aus dem Ausgabeabschnitt enthält.
// 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;
}
Siehe auch
Stream-E/A
Interpretation von Multibytezeichensequenzen
fclose
, _fcloseall
_fdopen
, _wfdopen
ferror
_fileno
freopen
, _wfreopen
_open
, _wopen
_setmode
_sopen
, _wsopen