Udostępnij za pośrednictwem


fopen, _wfopen

Otwiera plik.Bezpieczniejsze wersje te funkcje są dostępne; see 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
    Typ dostępu, który jest włączony.

Wartość zwracana

Każda z tych funkcji zwraca wskaźnik do otwartego pliku.Wartość Pusty wskaźnik wskazuje na błąd.Jeśli filename lub mode jest NULL lub ciąg pusty, funkcje te wyzwolić obsługa nieprawidłowy parametr, który jest opisany w Sprawdzanie poprawności parametru.Jeśli wykonanie może kontynuować, funkcje te zwracają NULL i errno do EINVAL.

Aby uzyskać więcej informacji, zobacz errno, _doserrno, _sys_errlist i _sys_nerr.

Uwagi

fopen Funkcja otwiera plik, który jest określony przez filename._wfopenjest ona szerokich znaków do fopen; argumenty w funkcji _wfopen są ciągami szerokich znaków.W przeciwnym razie _wfopen i fopen zachowują się identycznie.Tylko za pomocą _wfopen nie ma wpływu na zestaw znaków zakodowanych, który jest używany w strumieniu pliku.

fopenakceptuje ścieżki, które są dozwolone w systemie plików w punkcie realizacji; fopenakceptuje ścieżki, które mogą obejmować i ścieżek UNC mapowane dyski sieciowe, tak długo, jak system, który wykonuje kod ma dostęp do udziału lub zmapowanego w czasie wykonywania.Kiedy można skonstruować ścieżek dla fopen, upewnij się, że dyski, ścieżki lub udziały sieciowe będą dostępne w środowisko wykonawcze.Kreska ułamkowa (/) lub ukośniki odwrotne (\) służy jako separatory katalogu w ścieżce.

Zawsze sprawdzaj wartość zwracana, aby zobaczyć, czy wskaźnik jest pusty, przed wykonaniem wszelkich dalszych operacji na pliku.Jeśli wystąpi błąd, zmienna globalna errno jest ustawiona i może być używany do uzyskiwania informacji określony błąd.Aby uzyskać więcej informacji, zobacz errno, _doserrno, _sys_errlist i _sys_nerr.

Obsługa standardu Unicode

fopenobsługuje strumienie plik Unicode.Aby otworzyć plik Unicode, należy przekazać ccs Flaga określająca odpowiednie kodowanie, aby fopenw następujący.

fopen(&fp, "newfile.txt", "rw, ccs=encoding");

Allowed values of encoding are UNICODE, UTF-8, and UTF-16LE.

Jeżeli plik już istnieje i jest otwarty do odczytu lub dołączanie, bajt kolejność Mark (BOM), czy przedstawić w pliku, określa kodowanie.Kodowanie BOM ma pierwszeństwo nad kodowanie, określonej przez ccs flagi.ccs Używane jest kodowanie tylko wtedy, gdy żaden BOM nie jest obecny, lub plik jest nowy plik.

[!UWAGA]

Wykrywanie BOM dotyczy tylko plików, które są otwierane w trybie Unicode (to znaczy przechodzącą przez ccs flagę).

W następującej tabeli podsumowano tryby, które są używane dla różnych ccs flagi nadana fopen i bajt kolejność znaków w pliku.

Standardy kodowania używane na podstawie ccs Flaga i BOM-u

ccsFlaga

Nie BOM-u (lub nowy plik)

BOM-U: UTF-8

BOM-U: 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 do pisania w trybie Unicode mają BOM automatycznie zapisywane do nich.

Jeśli mode jest "a, ccs=<encoding>", fopen najpierw próbuje otworzyć plik z odczytu i zapisu.Jeśli operacja się powiedzie, funkcja odczytuje BOM, aby określić kodowanie pliku; Jeśli to się nie powiedzie, funkcja używa domyślnego kodowania dla pliku.W obu przypadkach fopen następnie ponownie otwórz plik z dostępem tylko do zapisu.(Dotyczy to a tryb tylko, aby nie a+ tryb.)

Tekst rodzajowy rutynowych mapowania

TCHAR.Rozpoczęto wykonywanie procedury h

_UNICODE & _MBCS nie zdefiniowany

_MBCS, definicja

_UNICODE, definicja

_tfopen

fopen

fopen

_wfopen

Ciąg znaków mode określa rodzaj dostępu, który jest wymagany dla pliku, następująco.

  • "r"
    Zostanie otwarty do odczytu.Jeśli plik nie istnieje lub nie można znaleźć, fopen wywołanie kończy się niepowodzeniem.

  • "w"
    Otwiera pusty plik do zapisu.Jeśli dany plik istnieje, jego zawartość są niszczone.

  • "a"
    Zostanie otwarty do zapisu na końcu pliku (dołączanie), bez usuwania znacznik końca pliku (EOF), przed zapisaniem nowych danych do pliku.Powoduje utworzenie pliku, jeśli nie istnieje.

  • "r+"
    Otwiera zarówno Odczyt i zapis.Plik musi istnieć.

  • "w+"
    Otwiera pusty plik do zarówno odczytu i zapisu.Jeżeli plik istnieje, jego zawartość są niszczone.

  • "a+"
    Zostanie otwarty do odczytu i dołączanie.Dołączając operacja obejmuje usunięcie znacznik EOF, przed zapisaniem nowych danych do pliku.Znacznik EOF nie zostanie przywrócona po zakończeniu pisania.Powoduje utworzenie pliku, jeśli nie istnieje.

Kiedy plik jest otwarty za pomocą "a" dostęp typu lub "a+" dostęp typu zapis wszystkich operacji występuje na końcu pliku.Wskaźnik pliku może być przeniesiony za pomocą fseek lub rewind, ale jest zawsze przenoszony z powrotem na końcu pliku zanim pisać jedną czynność jest przeprowadzana.W związku z tym nie można zastąpić istniejące dane.

"a" Trybu nie powoduje usunięcia znacznik EOF, zanim dołącza go do pliku.Po wystąpieniu dołączenie polecenia systemu MS-DOS TYPE pokazuje tylko dane do oryginalnego znacznik EOF i nie wszystkie dane dołączane do pliku.Zanim dołącza go do pliku, "a+" tryb Usuń znacznik EOF.Po dołączanie, polecenia MS-DOS TYPE pokazuje wszystkie dane w pliku."a+" Tryb jest wymagany dla dołączania do pliku strumienia, który jest zakończony ze znacznikiem EOF CTRL + Z.

Gdy "r+", "w+", lub "a+" jest określony typ dostępu, zarówno do czytania i pisania są dozwolone (plik mówi się, że otwarty do "aktualizacja").Po przełączeniu czytanie na pismo wejściowego operacji musi wystąpić znacznik EOF.Jeśli nie ma żadnych EOF, należy użyć wywołania pliku pozycjonowanie funkcji.Funkcje pozycjonowania pliku są fsetpos, fseek, i rewind.Po przełączeniu się z zapisu do czytania, należy użyć wywołania albo fflush lub do pliku pozycjonowanie funkcji.

Oprócz wartości wcześniejszych następujących znaków może być dołączona na mode Aby określić tryb tłumaczenia na znaki nowego wiersza.

  • t
    Otwórz w tekście (translacji) tryb.W tym trybie CTRL + Z jest interpretowana jako znak EOF na wejściu.W plikach, które są otwarte dla odczytu/zapisu, korzystając z "a+", fopen sprawdza, czy CTRL + Z na końcu pliku i usuwa go, jeśli to możliwe.Odbywa się, ponieważ korzysta z fseek i ftell w pliku, który może powodować kończy CTRL + Z fseek będzie działać niepoprawnie pod koniec pliku.

W trybie tekstowym karetki ze zmianą wiersza kombinacje są tłumaczone na pojedynczej znaki wysuwu wiersza na wejściu, a znaki wysuwu wiersza są tłumaczone na przewóz kombinacjach ze zmianą wiersza w danych wyjściowych.Kiedy funkcja strumienia i/o Unicode działa w trybie tekstowym (ustawienie domyślne), źródła lub strumień docelowy zakłada się sekwencję znaków wielobajtowych.W związku z tym, funkcji strumień wejściowy Unicode, konwertuje znaki wielobajtowe na szerokości znaków (tak jakby za pomocą wywołania mbtowc funkcji).Z tego samego powodu funkcji strumienia wyjściowego Unicode konwertuje szerokości znaków na znaki wielobajtowe (tak jakby za pomocą wywołania wctomb funkcji).

  • b
    Otwórz w trybie binarnym (niezrozumiały); tłumaczenia udziałem znaki powrotu karetki i wysuwu wiersza są odrzucane.

Jeśli t lub b nie została podana w mode, domyślnie tryb konwersji jest definicją zmiennej globalnej _fmode.Jeśli t lub b jest poprzedzona argument, funkcja kończy się niepowodzeniem 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 Tekst i we/wy pliku w trybie binarnym i Unicode strumień we/wy w trybach binarne i tekst.

  • c
    Włączyć flagę zatwierdzanie skojarzonych z nim filename tak, aby zawartość buforu pliku zostanie zapisana bezpośrednio na dysku, jeśli każda fflush lub _flushall nosi nazwę.

  • n
    Resetuj flagę zatwierdzanie skojarzonych z nim filename do "Zatwierdzanie nie." Domyślnie włączone.Zastępuje ona również flagi globalne zatwierdzanie jeśli połączymy nasz program, z COMMODE.OBJ.Domyślnie flaga globalnego commit jest "Zatwierdzanie nie", chyba że zostaną jawnie połączone programu z KOMODA.OBJ (see Opcje łącza).

  • N
    Określa, że plik nie jest dziedziczona przez procesy podrzędne.

  • S
    Określa, że buforowanie jest zoptymalizowany pod kątem, ale nie ogranicza się do dostępu sekwencyjnego z dysku.

  • R
    Określa, że buforowanie jest zoptymalizowany pod kątem, ale nie ogranicza się do dostępie z dysku.

  • T
    Określa plik jako tymczasowy.Jeśli to możliwe, nie jest opróżniany na dysku.

  • D
    Określa plik jako tymczasowy.Skreśla się, gdy ostatni wskaźnik pliku jest zamknięty.

  • ccs=ENCODING
    Określa zestaw znaków zakodowanych obsłudze (UTF-8, UTF-16LE, lub UNICODE) dla tego pliku.Pozostać nieokreślony, jeśli ma kodowanie ANSI.

Prawidłowe znaki mode ciąg, który jest używany w fopen i _fdopen odpowiadają oflag argumenty, które są używane w _O i _sopenw następujący.

W trybie ciągu znaków

Równoważne 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 trybie, nie ma portu kodu i oczekiwać odczytać większość dużego pliku lub jest nieistotne wydajność sieci, należy także rozważyć czy należy używać pamięci mapowanymi plików Win32 jako opcja.

Wymagania

Funkcja

Wymaganego nagłówka

fopen

<stdio.h>

_wfopen

<stdio.h> lub <wchar.h>

Aby uzyskać więcej informacji na temat zgodności, zobacz Zgodność.

c, n, t, S, R, T, I Dmode opcje są rozszerzenia Microsoft dla fopen i _fdopen i nie powinny być używane gdzie przenoszenia ANSI jest pożądane.

Przykład

Następujący program otwiera dwa pliki.Używa fclose zamknąć pierwszy plik i _fcloseall aby 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 zastępuje jeden, jeśli istnieje), w trybie tekstowym które kodowanie Unicode.Następnie zapisuje dwa ciągi znaków do pliku i zamyka plik.Wyjście jest plik o nazwie _wfopen_test.xml, która zawiera dane z części wyjściowej.

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

Odpowiednik w programie .NET Framework

Zobacz też

Informacje

Strumień we/wy

Interpretacja sekwencje znaków wielobajtowych

fclose, _fcloseall

_fdopen, _wfdopen

ferror

_fileno

freopen, _wfreopen

_open, _wopen

_setmode

_sopen, _wsopen