_open, _wopen

Otwiera plik. Te funkcje są przestarzałe, ponieważ są dostępne bardziej bezpieczne wersje; zobacz _sopen_s, _wsopen_s.

Składnia

int _open(
   const char *filename,
   int oflag [,
   int pmode]
);
int _wopen(
   const wchar_t *filename,
   int oflag [,
   int pmode]
);

Parametry

filename
Nazwa pliku.

oflag
Dozwolony rodzaj operacji.

pmode
Tryb uprawnień.

Wartość zwracana

Każda z tych funkcji zwraca deskryptor plików dla otwartego pliku. Zwracana wartość -1 wskazuje błąd; w takim przypadku errno jest ustawiona na jedną z następujących wartości.

errno Wartość Stan
EACCES Podjęto próbę otwarcia pliku tylko do odczytu do zapisu, tryb udostępniania pliku nie zezwala na określone operacje lub dana ścieżka jest katalogiem.
EEXIST _O_CREAT i _O_EXCL określone flagi, ale filename już istnieje.
EINVAL Nieprawidłowy oflag lub pmode argument.
EMFILE Nie są dostępne żadne deskryptory plików (zbyt wiele plików jest otwartych).
ENOENT Nie można odnaleźć pliku lub ścieżki.

Aby uzyskać więcej informacji na temat tych i innych kodów powrotnych, zobacz errno, _doserrno, _sys_errlisti _sys_nerr.

Uwagi

Funkcja _open otwiera plik określony przez filename i przygotowuje go do odczytu lub zapisu, jak określono w oflagpliku . _wopen jest wersją szerokoznakową ; _openargument to filename_wopen ciąg o szerokim znaku. _wopen i _open zachowywać się identycznie inaczej.

Mapowania procedur tekstu ogólnego

<tchar.h> Rutynowych _UNICODE i _MBCS niezdefiniowane _MBCS Zdefiniowane _UNICODE Zdefiniowane
_topen _open _open _wopen

oflag to wyrażenie całkowite utworzone na podstawie co najmniej jednej z następujących stałych manifestu lub kombinacji stałych, które są zdefiniowane w elemecie <fcntl.h>.

oflag Stała Zachowanie
_O_APPEND Przenosi wskaźnik pliku na koniec pliku przed każdą operacją zapisu.
_O_BINARY Otwiera plik w trybie binarnym (nieprzetłumaczonym). (Zobacz fopen opis trybu binarnego).
_O_CREAT Tworzy plik i otwiera go do zapisu. Nie ma wpływu, jeśli plik określony przez filename istnieje. Argument pmode jest wymagany, gdy _O_CREAT jest określony.
_O_CREAT | _O_SHORT_LIVED Tworzy plik jako tymczasowy, a jeśli to możliwe, nie jest opróżniany na dysk. Argument pmode jest wymagany, gdy _O_CREAT jest określony.
_O_CREAT | _O_TEMPORARY Tworzy plik jako tymczasowy; plik jest usuwany po zamknięciu ostatniego deskryptora plików. Argument pmode jest wymagany, gdy _O_CREAT jest określony. Aby zachować starsze zachowanie w celu zachowania zgodności aplikacji, inne procesy nie mogą usuwać tego pliku.
_O_CREAT | _O_EXCL Zwraca wartość błędu, jeśli plik określony przez filename istnieje. Stosuje się tylko wtedy, gdy jest używany z _O_CREAT.
_O_NOINHERIT Zapobiega tworzeniu deskryptora udostępnionego pliku.
_O_RANDOM Określa, że buforowanie jest zoptymalizowane pod kątem, ale nie ogranicza się do losowego dostępu z dysku.
_O_RDONLY Otwiera plik tylko do odczytu. Nie można określić za pomocą _O_RDWR polecenia lub _O_WRONLY.
_O_RDWR Otwiera plik do odczytu i zapisu. Nie można określić za pomocą _O_RDONLY polecenia lub _O_WRONLY.
_O_SEQUENTIAL Określa, że buforowanie jest zoptymalizowane pod kątem, ale nie ogranicza się do sekwencyjnego dostępu z dysku.
_O_TEXT Otwiera plik w trybie tekstowym (przetłumaczonym). (Aby uzyskać więcej informacji, zobacz Pliki we/ wy i pliki trybu binarnego i tekstowego oraz fopen.)
_O_TRUNC Otwiera plik i obcina go do zerowej długości; plik musi mieć uprawnienia do zapisu. Nie można określić za pomocą polecenia _O_RDONLY. _O_TRUNC używany z _O_CREAT otwiera istniejący plik lub tworzy plik. Uwaga: flaga _O_TRUNC niszczy zawartość określonego pliku.
_O_WRONLY Otwiera plik do zapisywania tylko. Nie można określić za pomocą _O_RDONLY polecenia lub _O_RDWR.
_O_U16TEXT Otwiera plik w trybie Unicode UTF-16.
_O_U8TEXT Otwiera plik w trybie Unicode UTF-8.
_O_WTEXT Otwiera plik w trybie Unicode.

Aby określić tryb dostępu do pliku, należy określić wartość _O_RDONLY, _O_RDWRlub _O_WRONLY. Nie ma wartości domyślnej dla trybu dostępu.

Jeśli _O_WTEXT jest używany do otwierania pliku do odczytu, _open odczytuje początek pliku i sprawdza, czy nie ma znaku kolejności bajtów (BOM). Jeśli istnieje model BOM, plik jest traktowany jako UTF-8 lub UTF-16LE, w zależności od modelu BOM. Jeśli nie ma modelu BOM, plik jest traktowany jako ANSI. Gdy plik jest otwierany do zapisywania przy użyciu programu _O_WTEXT, jest używany protokół UTF-16. Niezależnie od poprzedniego ustawienia lub znacznika kolejności bajtów, jeśli _O_U8TEXT jest używany, plik jest zawsze otwierany jako UTF-8. Jeśli _O_U16TEXT jest używany, plik jest zawsze otwierany jako UTF-16.

Gdy plik jest otwierany w trybie Unicode przy użyciu _O_WTEXTfunkcji wejściowych , _O_U8TEXTlub _O_U16TEXT, tłumaczy dane odczytywane z pliku na dane UTF-16 przechowywane jako typ wchar_t. Funkcje zapisu w pliku otwartym w trybie Unicode oczekują buforów zawierających dane UTF-16 przechowywane jako typ wchar_t. Jeśli plik jest zakodowany jako UTF-8, dane UTF-16 są tłumaczone na utF-8 podczas zapisywania. Zawartość zakodowana w formacie UTF-8 jest tłumaczona na kodOWANIE UTF-16 podczas jego odczytywania. Próba odczytania lub zapisania nieparzystej liczby bajtów w trybie Unicode powoduje błąd weryfikacji parametru. Aby odczytywać lub zapisywać dane przechowywane w programie jako UTF-8, użyj trybu pliku tekstowego lub binarnego zamiast trybu Unicode. Odpowiadasz za każde wymagane tłumaczenie kodowania.

Jeśli _open jest wywoływany z _O_WRONLY | _O_APPEND (tryb dołączania) i _O_WTEXT_O_U16TEXT, lub _O_U8TEXT, najpierw próbuje otworzyć plik do odczytu i zapisu, przeczytaj BOM, a następnie otwórz go ponownie tylko do zapisu. Jeśli otwarcie pliku do odczytu i zapisu zakończy się niepowodzeniem, spowoduje to otwarcie pliku tylko do zapisu i użycie wartości domyślnej dla ustawienia trybu Unicode.

Gdy co najmniej dwie stałe manifestu są używane do tworzenia argumentu oflag , stałe są łączone z operatorem bitowym OR ( | ). Aby zapoznać się z omówieniem trybów binarnych i tekstowych, zobacz We/Wy pliku w trybie tekstowym i binarnym.

pmode Argument jest wymagany tylko wtedy, gdy _O_CREAT jest określony. Jeśli plik już istnieje, pmode zostanie zignorowany. pmode W przeciwnym razie określa ustawienia uprawnień do pliku, które są ustawiane po pierwszym zamknięciu nowego pliku. _open stosuje bieżącą maskę uprawnień do pliku przed pmode ustawieniem uprawnień. (Aby uzyskać więcej informacji, zobacz _umask.) pmode to wyrażenie całkowite, które zawiera jedną lub obie następujące stałe manifestu, które są zdefiniowane w elemecie <sys\stat.h>.

pmode Znaczenie
_S_IREAD Dozwolone jest tylko odczytywanie.
_S_IWRITE Dozwolone pisanie. (W efekcie zezwala na odczytywanie i zapisywanie).
_S_IREAD | _S_IWRITE Dozwolone jest odczytywanie i zapisywanie.

Gdy obie stałe są podane, są one połączone z operatorem bitowym OR ( | ). W systemie Windows wszystkie pliki są czytelne; Uprawnienie tylko do zapisu nie jest dostępne. W związku z tym tryby _S_IWRITE i _S_IREAD | _S_IWRITE są równoważne.

Jeśli określono wartość inną niż niektóre kombinacje _S_IREAD i _S_IWRITE jest określona dla pmode— nawet jeśli określi prawidłową pmode wartość w innym systemie operacyjnym lub jeśli określono dowolną wartość inną niż dozwolone oflag wartości, funkcja generuje asercji w trybie debugowania i wywołuje nieprawidłową procedurę obsługi parametrów, zgodnie z opisem w temacie Walidacja parametrów. Jeśli wykonywanie jest dozwolone do kontynuowania, funkcja zwraca wartość -1 i ustawia wartość errnoEINVAL.

Wymagania

Function Wymagany nagłówek Opcjonalny nagłówek
_open <io.h> <fcntl.h>, <sys\types.h>, <sys\stat.h>
_wopen <io.h> lub <wchar.h> <fcntl.h>, <sys\types.h>, <sys\stat.h>

_open i _wopen są rozszerzeniami firmy Microsoft. Aby uzyskać więcej informacji o zgodności, zobacz Zgodność.

Biblioteki

Wszystkie wersje bibliotek czasu wykonywania języka C.

Przykład

// crt_open.c
// compile with: /W3
/* This program uses _open to open a file
* named CRT_OPEN.C for input and a file named CRT_OPEN.OUT
* for output. The files are then closed.
*/
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <io.h>
#include <stdio.h>

int main( void )
{
   int fh1, fh2;

   fh1 = _open( "CRT_OPEN.C", _O_RDONLY ); // C4996
   // Note: _open is deprecated; consider using _sopen_s instead
   if( fh1 == -1 )
      perror( "Open failed on input file" );
   else
   {
      printf( "Open succeeded on input file\n" );
      _close( fh1 );
   }

   fh2 = _open( "CRT_OPEN.OUT",
                _O_WRONLY | _O_CREAT,
                _S_IREAD | _S_IWRITE ); // C4996
   if( fh2 == -1 )
      perror( "Open failed on output file" );
   else
   {
      printf( "Open succeeded on output file\n" );
      _close( fh2 );
   }
}

Wynik

Open succeeded on input file
Open succeeded on output file

Zobacz też

We/Wy niskiego poziomu
_chmod, _wchmod
_close
_creat, _wcreat
_dup, _dup2
fopen, _wfopen
_sopen, _wsopen