_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_errliste _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:

mode Modificatore 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 opzioni t, c e nmode 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 _fmodeglobale . 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