_fdopen
, _wfdopen
Associa un flusso a un file che è stato precedentemente aperto per I/O di basso livello.
Sintassi
FILE *_fdopen(
int fd,
const char *mode
);
FILE *_wfdopen(
int fd,
const wchar_t *mode
);
Parametri
fd
Descrittore di file del file aperto.
mode
Tipo di accesso ai file.
Valore restituito
Ognuna di queste funzioni restituisce un puntatore al flusso aperto. Un valore di puntatore Null indica un errore. Quando si verifica un errore, viene richiamato il gestore di parametri non validi, come descritto in Convalida dei parametri. Se l'esecuzione può continuare, errno
viene impostato su EBADF
, che indica un descrittore del file non valido, o su EINVAL
, che indica che mode
era un puntatore null.
Per altre informazioni su questi e altri codici di errore, vedere errno
, _doserrno
, _sys_errlist
e _sys_nerr
.
Osservazioni:
La funzione _fdopen
associa un flusso di I/O al file identificato da fd
e pertanto consente che un file aperto per I/O di basso livello sia memorizzato nel buffer e formattato. _wfdopen
è una versione a caratteri wide di _fdopen
; l'argomento mode
in _wfdopen
è una stringa di caratteri wide. In caso contrario, _wfdopen
e _fdopen
si comportano in modo identico.
I descrittori di file passati in _fdopen
sono di proprietà del flusso restituito FILE *
. Se _fdopen
ha esito positivo, non chiamare _close
il descrittore di file. La chiamata fclose
all'oggetto restituito FILE *
chiude anche il descrittore di file.
Per impostazione predefinita, lo stato globale di questa funzione è limitato all'applicazione. Per modificarlo, vedere Stato globale in CRT.
La mode
stringa di caratteri specifica il tipo di accesso al file richiesto per il file:
mode |
Accesso |
---|---|
"r" |
Viene aperto per la lettura. Se il file non esiste o non è stato trovato, la fopen chiamata non riesce. |
"w" |
Apre un file vuoto per la scrittura. Se il file specificato esiste, il contenuto viene eliminato in modo permanente. |
"a" |
Apre per la scrittura alla fine del file (aggiunta). Creare il file se non esiste. |
"r+" |
Viene aperto per la lettura e la scrittura. Il file deve esistere. |
"w+" |
Apre un file vuoto per la lettura e la scrittura. Se il file esiste, il contenuto viene eliminato in modo permanente. |
"a+" |
Viene aperto per la lettura e l'aggiunta. Creare il file se non esiste. |
Quando un file viene aperto con il tipo di accesso "a"
o "a+"
, tutte le operazioni di scrittura si verificano alla fine del file. Il puntatore al file può essere riposizionato usando fseek
o rewind
, ma viene sempre spostato di nuovo alla fine del file prima che venga eseguita un'operazione di scrittura. Di conseguenza, i dati esistenti non possono essere sovrascritti. Quando il tipo di accesso "r+"
, "w+"
o "a+"
viene specificato, sono consentite sia la lettura che la scrittura (il file viene definito aperto per "l'aggiornamento"). Tuttavia, quando si passa da lettura a scrittura, deve esserci una nuova operazione fflush
, fsetpos
, fseek
o rewind
. È possibile specificare la posizione corrente per l'operazione fsetpos
o fseek
, se si desidera.
Oltre ai valori precedenti, è anche possibile includere i caratteri seguenti in mode
per specificare la modalità di conversione per i caratteri di nuova riga:
Modificatore mode |
Comportamento |
---|---|
t |
Aprire in modalità testo (convertita). In questa modalità, le combinazioni di ritorno a capo-avanzamento di riga (CR-LF) vengono convertite in un avanzamento riga (LF) al momento dell'input e i caratteri di avanzamento riga vengono convertiti in combinazioni di ritorno a capo-avanzamento di riga (CR-LF) al momento dell'output. Inoltre, CTRL+Z viene interpretato nell'input come carattere di fine file. |
b |
Aprire in modalità binaria (non convertita). Tutte le conversioni dalla modalità t vengono eliminate. |
c |
Abilitare il flag commit per filename associato, in modo da scrivere il contenuto del buffer di file direttamente su disco se viene chiamato fflush o _flushall . |
n |
Reimpostare il flag di commit per l'oggetto associato filename a "no-commit". Questo flag è il valore predefinito. Esegue anche l'override del flag di commit globale se si collega il programma a Commode.obj . Il valore predefinito del flag di commit globale è "no-commit", a meno che il programma non venga collegato in modo esplicito a Commode.obj . |
Le t
opzioni , c
e n
mode
sono estensioni Microsoft per fopen
e _fdopen
. Non usarli se si vuole mantenere la portabilità ANSI.
Se t
o b
non viene specificato in mode
, la modalità di conversione predefinita viene definita dalla variabile _fmode
globale . Se t
o b
è il prefisso dell'argomento, la funzione ha esito negativo e restituisce NULL
. Per una descrizione delle modalità di testo e binario, vedere I/O di file in modalità testo e binario.
I caratteri validi per la mode
stringa usata in e _fdopen
corrispondono agli oflag
argomenti usati in fopen
_open
e _sopen
, come illustrato nella tabella seguente:
Caratteri nella stringa mode |
Valore equivalente oflag per _open e _sopen |
---|---|
a |
_O_WRONLY | _O_APPEND (in genere _O_WRONLY | _O_CREAT | _O_APPEND ) |
a+ |
_O_RDWR | _O_APPEND (in genere _O_RDWR | _O_APPEND | _O_CREAT ) |
r |
_O_RDONLY |
r+ |
_O_RDWR |
w |
_O_WRONLY (in genere _O_WRONLY | _O_CREAT | _O_TRUNC ) |
w+ |
_O_RDWR (in genere _O_RDWR | _O_CREAT | _O_TRUNC ) |
b |
_O_BINARY |
t |
_O_TEXT |
c |
None |
n |
None |
Requisiti
Funzione | Intestazione obbligatoria | Intestazione C++ |
---|---|---|
_fdopen |
<stdio.h> |
<cstdio> |
_wfdopen |
<stdio.h> oppure <wchar.h> |
<cstdio> |
Per altre informazioni sulla conformità degli standard e sulle convenzioni di denominazione nella libreria di runtime C, vedere Compatibilità.
Mapping di routine di testo generico
<tchar.h> routine |
_UNICODE e _MBCS non definito |
_MBCS definito |
_UNICODE definito |
---|---|---|---|
_tfdopen |
_fdopen |
_fdopen |
_wfdopen |
Esempio
// 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 );
}
Input: crt_fdopen.txt
Line one
Line two
Output
Lines in file: 2
Vedi anche
I/O di flusso
_dup
, _dup2
fclose
, _fcloseall
fopen
, _wfopen
freopen
, _wfreopen
_open
, _wopen