_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 EBADF
wartość , 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_errlist
i _sys_nerr
.
Uwagi
Funkcja _fdopen
kojarzy strumień we/wy z plikiem, który jest identyfikowany przez fd
element , 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ą ; _fdopen
argument 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 fflush
operacji , fsetpos
, lub fseek
rewind
. 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
, c
i 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