fopen, _wfopen
Otwiera plik.Zabezpieczyć inne wersje te funkcje są dostępne; zobacz fopen_s, _wfopen_s.
FILE *fopen( const char *filename, const char *mode ); FILE *_wfopen( const wchar_t *filename, const wchar_t *mode );
Parametry
filename
Nazwa pliku.mode
Rodzaj dostępu, który jest włączony.
Wartość zwracana
Każda z tych funkcji zwraca wskaźnik do pliku open.Wartość null wskaźnik wskazuje błąd.Jeśli filename lub mode jest NULL lub pustego ciągu, realizacja tych funkcji obsługi nieprawidłowy parametr, który jest opisany w Sprawdzanie poprawności parametru.Jeśli jest dozwolone wykonywanie, aby kontynuować, te funkcje zwracają NULL i ustawić errno do EINVAL.
Aby uzyskać więcej informacji, zobacz errno, _doserrno, _sys_errlist, and _sys_nerr.
Uwagi
fopen Funkcji otwiera plik, który jest określona przez filename._wfopento wersja całego znaku fopen; argumenty do _wfopen są ciągi znaków sieci.W przeciwnym razie _wfopen i fopen zachowują się tak samo.Tylko za pomocą _wfopen nie ma wpływu na zestaw znaków kodowane, który jest używany w strumieniu pliku.
fopenakceptuje ścieżki, które są prawidłowe w systemie plików w punkcie wykonania; fopen akceptuje ścieżki UNC i ścieżki, które obejmują mapowane dyski sieciowe tak długo, jak system, który wykonuje kod ma dostęp do udziału lub zamapowany dysk w czasie wykonywania.Kiedy skonstruowania ścieżki dla fopen, upewnij się, że dyski, ścieżki lub udziałów sieciowych, będzie ona dostępna w środowisku wykonywania.Można użyć ukośnika (/) lub odwrócone (\) jako separatora katalogu w ścieżce.
Zawsze sprawdzić wartość zwrotną aby zobaczyć, czy wskaźnik ma wartość NULL, przed wykonaniem żadnych dalszych operacji na pliku.W przypadku wystąpienia błędu, zmiennej globalnej errno ustawiono i pozwala uzyskać informacje błędu.Aby uzyskać więcej informacji, zobacz errno, _doserrno, _sys_errlist, and _sys_nerr.
Obsługa formatu Unicode
fopenobsługuje strumieni plików Unicode.Aby otworzyć plik Unicode, należy przekazać ccs Flaga określająca żądane kodowanie fopen, w następujący sposób.
fopen(&fp, "newfile.txt", "rt+, ccs=encoding");
Dozwolone wartości encoding są UNICODE, UTF-8, i UTF-16LE.
Jeśli plik jest otwarty w trybie Unicode, input funkcji tłumaczenia danych, który jest odczytywany z pliku na UTF-16 dane przechowywane jako typ wchar_t.Funkcje, które zapisu w pliku otworzyć w trybie Unicode oczekuje buforów, które zawierają dane UTF-16 przechowywane jako typ wchar_t.Jeśli plik jest zakodowane jako UTF-8, UTF-16 danych jest przetłumaczyć na UTF-8, gdy jest ona zapisywana i zawartości algorytmem UTF-8 jest przetłumaczyć UTF-16 została przeczytana.Podjęto próbę odczytu lub zapisu nieparzysta liczba bajtów w trybie Unicode powoduje błąd sprawdzania poprawności parametru.Do odczytu lub zapisu danych przechowywanych w swoim programie jako UTF-8, zamiast tekstowe lub binarne tryb pliku trybu Unicode.Użytkownik jest odpowiedzialny za wszelkie wymagane tłumaczenia kodowania.
Jeśli plik już istnieje i jest otwarty w celu odczytu lub dołączanie, bajtów kolejność znaku (BOM), jeśli jego obecne w pliku Określa kodowanie.Kodowanie BOM pierwszeństwo nad kodowanie określoną przez ccs flagi.ccs Kodowanie używana tylko w przypadku BOM nie znajduje się lub plik jest nowy plik.
[!UWAGA]
Wykrywanie BOM ma zastosowanie wyłącznie do plików, które są otwierane w trybie Unicode (czyli przez przekazanie ccs flaga).
Poniższa tabela zawiera podsumowanie tryby, które będą wyświetlane w różnych ccs flagi do fopen i znaczniki kolejność bajtów w pliku.
Kodowania używany w oparciu o ccs flagę i BOM
ccsFlaga |
Nie BOM (lub nowy plik) |
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 |
Pliki otwarte dla zapisu w trybie Unicode mają BOM automatycznie zapisane do nich.
Jeśli mode jest "a, ccs=<encoding>", fopen najpierw próbuje otworzyć pliku za pomocą zarówno odczytu i zapisu.Jeśli to się powiedzie, funkcja odczytuje BOM określić kodowania dla pliku. w przypadku niepowodzenia funkcji korzysta z domyślnego kodowania dla pliku.W obu przypadkach fopen zostanie ponownie otwórz plik z dostępem tylko do zapisu.(Dotyczy to a tryb tylko, aby nie a+ tryb.)
Mapowania procedur zwykłego tekstu
Procedura TCHAR.H |
_UNICODE & _MBCS nie zdefiniowano |
_MBCS zdefiniowano |
_UNICODE zdefiniowano |
---|---|---|---|
_tfopen |
fopen |
fopen |
_wfopen |
Ciąg znaków mode określa rodzaj dostępu do żądanego pliku, w następujący sposób.
"r"
Otwiera do odczytu.Jeśli plik nie istnieje lub nie można odnaleźć fopen wywołania nie powiodło się."w"
Otwiera pusty plik do zapisu.Jeśli dany plik istnieje, jego zawartość są związane."a"
Otwiera do zapisu na końcu pliku (dołączanie) bez usuwania znacznik końca pliku (EOF) przed zapisaniem nowych danych do pliku.Tworzy plik, jeśli on nie istnieje."r+"
Otwiera zarówno odczytu i zapisu.Plik musi istnieć."w+"
Otwiera pusty plik zarówno odczytu i zapisu.Jeśli plik istnieje, jego zawartość są związane."a+"
Otwiera do odczytywania i dołączanie.Dołączanie operacji obejmują usunięcie znacznik EOF przed zapisaniem nowych danych do pliku.Znacznik EOF nie zostało odzyskane po zakończeniu pisania.Tworzy plik, jeśli on nie istnieje.
Jeśli plik jest otwarty za pomocą "a" dostęp do typu lub "a+" dostęp do typu, wszystkie zapisu operacji występuje na końcu pliku.Może być położenia wskaźnika pliku przy użyciu fseek lub rewind, ale jest zawsze przenoszony z powrotem do końca pliku przed żadnego zapisu czynność jest przeprowadzana.Dlatego nie można zastąpić istniejących danych.
"a" Tryb nie usuwa znacznik EOF przed dołącza go do pliku.Po wystąpieniu dołączanie, polecenie typu MS-DOS wyświetlane są tylko dane do oryginalnego znacznika EOF i nie wszystkie dane dołączane do pliku.Przed dołącza go do pliku, "a+" tryb Usuń znacznik EOF.Po dołączeniu, polecenie typu MS-DOS przedstawia wszystkie dane w pliku."a+" Tryb jest wymagany do dołączania do pliku strumienia, który zostaje zakończone ze znacznikiem EOF CTRL + Z.
Gdy "r+", "w+", lub "a+" określono typ dostępu, zarówno odczytu i zapisu są dozwolone (plik jest określany jako dostępny do "update").Jednak po przełączeniu z odczytu do zapisu operacji wejściowych musi uwzględniać znacznik EOF.Jeśli nie ma żadnych EOF, trzeba użyć interwencji połączenia do pliku rozmieszczania funkcji.Funkcje położenia pliku fsetpos, fseek, i rewind.Po przełączeniu z zapisu do odczytu, należy użyć interwencji wywołaniem metody fflush lub do pliku rozmieszczania funkcji.
Oprócz wcześniejszej wartości następujących znaków może zostać dołączona do mode do określania tryb translacji znaków nowego wiersza.
- t
Otwórz w tekście (translacji) trybu.W tym trybie CTRL + Z jest interpretowany jako znak EOF na dane wejściowe.W plikach, które są otwierane do odczytu/zapisu za pomocą "a+", fopen sprawdza, czy CTRL + Z na końcu pliku i usuwa go, jeśli to możliwe.Ta czynność jest wykonywana, ponieważ za pomocą fseek i ftell można przenieść w pliku, które mogą spowodować kończy się na CTRL + Z fseek będzie działać nieprawidłowo w pobliżu na końcu pliku.
W trybie tekstowym karetki kombinacji zwrotu — wysuwu wiersza są przetłumaczone na pojedynczy znaki wysuwu wiersza w danych wejściowych, a znaki wysuwu wiersza są przetłumaczone na kombinacji zwrotu — wysuwu wiersza karetki w danych wyjściowych.Jeśli funkcja strumienia I/O Unicode działa w trybie tekstowym (domyślnie), źródło lub strumień docelowy jest przyjmuje się, że sekwencję znaków wielobajtowych.Dlatego funkcji strumień wejściowy Unicode konwertuje znaki wielobajtowe na znaki międzynarodowe (w przypadku przez wywołanie mbtowc funkcji).Z tego samego powodu funkcji strumienia wyjściowego Unicode konwertuje znaki międzynarodowe na znaki wielobajtowe (w przypadku przez wywołanie wctomb funkcji).
- b
Otwórz w trybie binarnym (niezrozumiały); tłumaczenia obejmującą znaki powrotu karetki i wysuwu wiersza są pomijane.
Jeśli t lub b nie znajduje się w mode, to domyślny tryb tłumaczenia jest definiowana za pomocą zmiennej globalnej _fmode.Jeśli t lub b jest poprzedzona argument, funkcja nie powiodło się i zwraca NULL.
Aby uzyskać więcej informacji na temat używania tekstu i trybów binarne w Unicode i wielobajtowych strumienia I/O zobacz Operacja We/Wy pliku w trybie binarnym i tekstowym i Strumień We/Wy Unicode w trybach tekstowym i binarnym.
c
Włącz flagi zatwierdzania skojarzonych z nim filename tak, aby zawartość buforu pliku zostanie zapisana bezpośrednio na dysku, jeśli użytkownik fflush lub _flushall jest wywoływana.n
Resetuj flagę zatwierdzania skojarzonych z nim filename do "nie zatwierdzania." Domyślnie włączone.Zastępuje ona również flagi globalne zatwierdzania Jeśli łącze programu z COMMODE.OBJ.Domyślnie flagi globalne zatwierdzania jest "nie zatwierdzania", chyba że wyraźnie łącze programu z COMMODE.OBJ. (zobacz Opcje łącz).N
Określa, że plik nie jest dziedziczone przez procesy podrzędne.S
Określa, że buforowanie jest zoptymalizowana pod kątem, ale nie ograniczone do kolejnych dostęp z dysku.R
Określa, że buforowanie jest zoptymalizowana pod kątem, ale nie ograniczone do RAM z dysku.T
Określa plik jako tymczasowych.Jeśli to możliwe, go nie wysłaniem na dysku.D
Określa plik jako tymczasowych.Jest ono usuwane po zamknięciu ostatnich wskaźnika pliku.ccs=ENCODING
Określa kodowane zestaw znaków używany (UTF-8, UTF-16LE, lub UNICODE) dla tego pliku.Jeśli chcesz, aby kodowanie ANSI pozostawić nieokreślony.
Prawidłowe znaki dla mode ciąg, który jest używany podczas fopen i _fdopen odpowiada oflag argumentów, które są używane w _otwórz zakończeniu działania i _sopen, w następujący sposób.
Znaki w trybie ciągu |
Odpowiednik oflag wartość dla _open/_sopen |
---|---|
a |
_O_WRONLY | _O_APPEND (usually _O_WRONLY | _O_CREAT | _O_APPEND) |
a+ |
_O_RDWR | _O_APPEND (usually _O_RDWR | _O_APPEND | _O_CREAT ) |
r |
_O_RDONLY |
r+ |
_O_RDWR |
w |
_O_WRONLY (usually _O_WRONLY | _O_CREAT | _O_TRUNC) |
w+ |
_O_RDWR (usually _O_RDWR | _O_CREAT | _O_TRUNC) |
b |
_O_BINARY |
t |
_O_TEXT |
c |
Brak |
n |
Brak |
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 |
Jeśli używasz rb tryb, nie trzeba określić port dla kodu i że większość dużego pliku do odczytu lub nie są dane dotyczące wydajności sieci, należy także rozważyć czy do użycia pamięci mapowane Win32 pliki jako opcji.
Wymagania
Funkcja |
Wymagany nagłówek |
---|---|
fopen |
< stdio.h > |
_wfopen |
< stdio.h > lub < wchar.h > |
_wfopento rozszerzenie firmy Microsoft.Aby uzyskać więcej informacji o zgodności, zobacz Zgodność.
The c, n, t, S, R, T, and D mode options are Microsoft extensions for fopen and _fdopen and should not be used where ANSI portability is desired.
Przykład
Następujący program otwiera dwóch plików.Używa fclose można zamknąć pliku pierwszy i _fcloseall zamknąć wszystkie pozostałe pliki.
// 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 );
}
Następujący program tworzy plik (lub jeden zastępowanie, jeśli istnieje), w trybie tekst ma kodowania Unicode.Następnie zapisuje dwa ciągi do pliku i zamyka plik.Dane wyjściowe są pliku o nazwie _wfopen_test.xml, zawierający dane z sekcji danych wyjściowych.
// 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;
}