Udostępnij za pośrednictwem


_fdopen, _wfdopen

Kojarzy strumień z plikiem, który został wcześniej otwarty dla operacji we/wy niskiego poziomu.

Składnia

FILE *_fdopen(
   int fd,
   const char *mode
);
FILE *_wfdopen(
   int fd,
   const wchar_t *mode
);

Parametry

fd
Deskryptor pliku otwartego.

mode
Typ dostępu do plików.

Wartość zwracana

Każda z tych funkcji zwraca wskaźnik do otwartego strumienia. Wartość wskaźnika o wartości null wskazuje błąd. W przypadku wystąpienia błędu wywoływana jest nieprawidłowa procedura obsługi parametrów, zgodnie z opisem w temacie Weryfikacja parametrów. Jeśli wykonywanie może być kontynuowane, errno jest ustawione na EBADFwartość , która wskazuje nieprawidłowy deskryptor plików lub EINVAL, co wskazuje, że mode był to wskaźnik o wartości null.

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

Uwagi

Funkcja _fdopen kojarzy strumień we/wy z plikiem, który jest identyfikowany przez fdelement , a tym samym umożliwia otwarcie pliku, który jest otwarty w celu buforowania i formatowania operacji we/wy niskiego poziomu. _wfdopen jest wersją szerokoznakową ; _fdopenargument to mode _wfdopen ciąg o szerokim znaku. _wfdopen i _fdopen w inny sposób zachowują się identycznie.

Deskryptory plików przekazywane do _fdopen są własnością zwróconego strumienia FILE * . Jeśli _fdopen operacja zakończy się pomyślnie, nie wywołaj _close deskryptora plików. Wywołanie fclose zwróconego skryptu FILE * zamyka również deskryptor plików.

Domyślnie stan globalny tej funkcji jest zakresem aplikacji. Aby go zmienić, zobacz Stan globalny w CRT.

Ciąg mode znaków określa typ dostępu do pliku żądanego dla pliku:

mode Access
"r" Otwiera plik do czytania. Jeśli plik nie istnieje lub nie można go odnaleźć, fopen wywołanie nie powiedzie się.
"w" Otwiera pusty plik do zapisu. Jeśli dany plik istnieje, jego zawartość zostanie zniszczona.
"a" Otwiera plik do zapisu na końcu pliku (dołączanie). Tworzy plik, jeśli nie istnieje.
"r+" Otwiera plik zarówno do czytania, jak i zapisu. Plik musi istnieć.
"w+" Otwiera pusty plik do odczytu i zapisu. Jeśli plik istnieje, jego zawartość zostanie zniszczona.
"a+" Otwiera plik do odczytu i dołączania. Tworzy plik, jeśli nie istnieje.

Po otwarciu "a" pliku z typem dostępu lub "a+" wszystkie operacje zapisu są wykonywane na końcu pliku. Wskaźnik pliku można zmienić za pomocą polecenia fseek lub rewind, ale zawsze jest przenoszony z powrotem na koniec pliku przed przeprowadzeniem dowolnej operacji zapisu. W związku z tym istniejące dane nie mogą być zastępowane. Po określeniu "r+"typu , "w+"lub "a+" dostępu zarówno odczyt, jak i zapis są dozwolone (plik jest podobno otwarty dla "aktualizacji"). Jednak w przypadku przełączania się między odczytem i zapisem musi istnieć interweniowanie fflushoperacji , fsetpos, lub fseekrewind . Możesz określić bieżące położenie operacji fsetpos lub fseek , jeśli chcesz.

Oprócz powyższych wartości można również uwzględnić następujące znaki, mode aby określić tryb tłumaczenia dla znaków nowego wiersza:

mode Modyfikator Zachowanie
t Otwórz w trybie tekstowym (przetłumaczonym). W tym trybie kombinacje zestawienia powrotu karetki (CR-LF) są tłumaczone na jednowierszowe kanały informacyjne (LF) w danych wejściowych, a znaki LF są tłumaczone na kombinacje CR-LF w danych wyjściowych. Ponadto Ctrl+Z są interpretowane jako znak końca pliku w danych wejściowych.
b Otwórz w trybie binarnym (nieprzetłumaczonym). Wszystkie tłumaczenia z t trybu są pomijane.
c Włącz flagę zatwierdzania skojarzonej filename , aby zawartość buforu plików została zapisana bezpośrednio na dysku, jeśli fflush jest wywoływana wartość lub _flushall .
n Zresetuj flagę zatwierdzenia dla skojarzonego filename z "no-commit". Ta flaga jest domyślna. Zastępuje również flagę zatwierdzenia globalnego, jeśli połączysz program za pomocą polecenia Commode.obj. Domyślna flaga zatwierdzenia globalnego to "no-commit", chyba że jawnie połączysz program z Commode.obj.

Opcje t, ci n mode to rozszerzenia firmy Microsoft dla fopen systemów i _fdopen. Nie używaj ich, jeśli chcesz zachować przenośność ANSI.

Jeśli t wartość lub b nie jest podana w programie mode, domyślny tryb tłumaczenia jest definiowany przez zmienną globalną _fmode. Jeśli t argument lub b jest poprzedzony prefiksem, funkcja kończy się niepowodzeniem i zwraca wartość NULL. Aby zapoznać się z omówieniem trybów tekstowych i binarnych, zobacz Tekst i tryb binarny we/wy pliku.

Prawidłowe znaki dla ciągu używanego mode w fopen obiekcie i _fdopen odpowiadają oflag argumentom używanym w _open systemach i _sopen, jak pokazano w poniższej tabeli:

Znaki w mode ciągu Równoważna oflag wartość dla i _open_sopen
a _O_WRONLY | _O_APPEND (zwykle _O_WRONLY | _O_CREAT | _O_APPEND)
a+ _O_RDWR | _O_APPEND (zwykle _O_RDWR | _O_APPEND | _O_CREAT)
r _O_RDONLY
r+ _O_RDWR
w _O_WRONLY (zwykle _O_WRONLY | _O_CREAT | _O_TRUNC)
w+ _O_RDWR (zwykle _O_RDWR | _O_CREAT | _O_TRUNC)
b _O_BINARY
t _O_TEXT
c Brak
n Brak

Wymagania

Function Wymagany nagłówek Nagłówek języka C++
_fdopen <stdio.h> <cstdio>
_wfdopen <stdio.h> lub <wchar.h> <cstdio>

Aby uzyskać więcej informacji na temat zgodności standardów i konwencji nazewnictwa w bibliotece środowiska uruchomieniowego języka C, zobacz Zgodność.

Mapowania procedur tekstu ogólnego

<tchar.h> rutyna _UNICODE i _MBCS niezdefiniowane _MBCS zdefiniowany _UNICODE zdefiniowany
_tfdopen _fdopen _fdopen _wfdopen

Przykład

// crt_fdopen.c
// This program opens a file by using low-level
// I/O, then uses _fdopen to switch to stream
// access. It counts the lines in the file.

#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
#include <share.h>

int main( void )
{
   FILE *stream;
   int  fd, count = 0;
   char inbuf[128];

   // Open a file.
   if( _sopen_s( &fd, "crt_fdopen.txt", _O_RDONLY, _SH_DENYNO, 0 ) )
      exit( 1 );

   // Get stream from file descriptor.
   if( (stream = _fdopen( fd, "r" )) == NULL )
      exit( 1 );

   while( fgets( inbuf, 128, stream ) != NULL )
      count++;

   // After _fdopen, close by using fclose, not _close.
   fclose( stream );
   printf( "Lines in file: %d\n", count );
}

Dane wejściowe: crt_fdopen.txt

Line one
Line two

Wynik

Lines in file: 2

Zobacz też

We/Wy strumienia
_dup, _dup2
fclose, _fcloseall
fopen, _wfopen
freopen, _wfreopen
_open, _wopen