Condividi tramite


fopen, _wfopen

Apre un file.Più versioni sicure di queste funzioni sono disponibili, vedere fopen_s, _wfopen_s.

FILE *fopen( 
   const char *filename,
   const char *mode 
);
FILE *_wfopen( 
   const wchar_t *filename,
   const wchar_t *mode 
);

Parametri

  • filename
    Nome file.

  • mode
    Tipo di accesso che è abilitato.

Valore restituito

Ognuna di queste funzioni restituisce un puntatore al file aperto.Un valore del puntatore NULL indica un errore.Se filename o mode è NULL o una stringa vuota, esse attivano il gestore non valido di parametro, come descritto in Convalida dei parametri.Se all'esecuzione è permesso continuare, queste funzioni restituiscono NULL e impostano errno a EINVAL.

Per ulteriori informazioni, vedere errno, _doserrno, _sys_errlist e _sys_nerr.

Note

La funzione di fopen apre il file specificato da filename._wfopen è una versione a caratteri estesi di fopen; gli argomenti a _wfopen sono stringhe di caratteri estesi.Altrimenti _wfopen e fopen si comportano in modo identico.Solo utilizzando _wfopen non ha effetto sul set di caratteri codificati utilizzato nel flusso di file.

fopen accetta i percorsi validi nel file system in corrispondenza dell'esecuzione; fopen accetta i percorsi UNC i percorsi in cui vengono utilizzate unità di rete mappate a condizione che il sistema che esegue il codice ha accesso alla condivisione o un'unità mappata ai tempi di esecuzione.Quando si creano i percorsi per fopen, assicurarsi che le unità, i percorsi, o condivisioni di rete siano disponibili nell'ambiente di esecuzione.È possibile utilizzare le barre (//) o le barre rovesciate (\) come separatori della directory in un percorso.

Verificare sempre il valore restituito per verificare se il puntatore NULL prima di eseguire nuove operazioni su file.Se si verifica un errore, la variabile globale errno è impostata e può essere utilizzata per ottenere informazioni specifiche.Per ulteriori informazioni, vedere errno, _doserrno, _sys_errlist e _sys_nerr.

Supporto per Unicode

flussi di file Unicode supportate difopen.Per aprire un file Unicode, passare un flag di ccs che specifica la codifica desiderata a fopen, come segue.

fopen(&fp, "newfile.txt", "rw, ccs=encoding");

I valori consentiti di encoding sono UNICODE, UTF-8e UTF-16LE.

Se il file esiste già e verrà visualizzato per indicare o aggiungere, l'indicatore dell'ordine dei byte (BOM), se presente nel file, determina la codifica.La codifica di BOM ha la precedenza sulla codifica specificata dal flag di ccs.La codifica di ccs viene utilizzata solo se nessun BOM presente o il file è un nuovo file.

[!NOTA]

Il rilevamento di BOM si applica solo ai file aperti in modalità Unicode (ovvero passando il flag di ccs ).

Nella tabella seguente vengono riepilogate le modalità utilizzate per vari flag di ccs forniti a fopen e gli indicatori dell'ordine dei byte nel file.

Codifiche utilizzate basate su flag di ccs e su BOM

Flag di ccs

Nessun BOM (o nuovo file)

BOM: UTF-8

BOM: UTF-16

UNICODE

UTF-16LE

UTF-8

UTF-16LE

UTF-8

UTF-8

UTF-8

UTF-16LE

UTF-16LE

UTF-16LE

UTF-8

UTF-16LE

I file aperti per la scrittura in modalità Unicode hanno un BOM scritto loro automaticamente.

Se mode è "a, ccs=<encoding>", fopen innanzitutto tenta di aprire il file con entrambi accesso in lettura e scrittura.Se questo ha esito positivo, la funzione legge il BOM per determinare la codifica del file; se questa operazione non riesce, la funzione utilizza la codifica predefinita per il file.In entrambi i casi, fopen quindi riaprirà il file con accesso di sola scrittura.(Si applica a a la modalità solo, non alla modalità di a+ ).

Mapping di routine a Testo generico

TCHAR.H routine

_UNICODE & _MBCS non definiti

_MBCS definito

_UNICODE definito

_tfopen

fopen

fopen

_wfopen

Una stringa di caratteri mode specifica il tipo di accesso che richiesta di file, come segue.

  • "r"
    Verrà aperto per leggere.Se il file non esiste o non è definito, la chiamata di fopen non riesce.

  • "w"
    Apre un file vuoto per scrivere.Se il file specificato esiste, il contenuto viene eliminato.

  • "a"
    Verrà aperto per la scrittura alla fine del file aggiungere () senza rimuovere il marcatore di fine file di (EOF) prima che i nuovi dati vengono scritti nel file.Crea il file se non esiste.

  • "r+"
    Viene aperto per la lettura e scrittura.Il file deve esistere.

  • "w+"
    Apre un file vuoto per la lettura e scrittura.Se il file esiste, il contenuto viene eliminato.

  • "a+"
    Verrà aperto per la lettura e aggiungere.L'operazione di spooling comporta la rimozione del marcatore di EOF prima che i nuovi dati vengono scritti nel file.Il marcatore di EOF non viene ripristinato dopo la scrittura è completa.Crea il file se non esiste.

Quando un file viene aperto utilizzando il tipo di accesso di "a" o il tipo di accesso di "a+", tutte le operazioni di scrittura si verificano alla fine del file.Il puntatore del file può essere riposizionato utilizzando fseek o rewind, ma sempre si sposta alla fine del file prima che qualsiasi operazione di scrittura sia eseguita.Di conseguenza, i dati esistenti non possono essere sovrascritti.

La modalità di "a" non rimuove il marcatore di EOF prima di associare il file.Dopo avere aggiunto si verifica, il comando TIPO1 MS-DOS vengono visualizzati solo i dati del marcatore di EOF originale e non i dati associati al file.Prima di associare il file, la modalità di "a+" rimuove il marcatore di EOF.Dopo avere aggiunto, il comando di TIPO1 MS-DOS mostra tutti i dati nel file.La modalità di "a+" è necessario per aggiungere a un file del flusso che termina con il marcatore di CTRL+Z EOF.

Quando "r+", "w+", o il tipo di accesso di "a+" è specificato, la lettura e la scrittura sono consentite (il file viene aperto per "l'aggiornamento").Tuttavia, quando si passa da lettura alla scrittura, l'operazione di input deve verificarsi un marcatore di EOF.Se non esiste alcun EOF, è necessario utilizzare una corrispondente chiamata a una funzione di posizionamento dei file.Le funzioni di posizionamento dei file sono fsetpos, fseeke rewind.Quando si passa da scrittura alla lettura, è necessario utilizzare una chiamata corrispondente a fflush o a una funzione di posizionamento dei file.

Oltre ai valori iniziali, i caratteri seguenti possono essere aggiunti a mode per specificare la modalità di conversione dei caratteri di nuova riga.

  • t
    Aprire la modalità di testo (tradotto).In questa modalità, CTRL+Z viene interpretato come carattere di EOF di input.Nei file aperti per indicare/scrittura tramite "a+", fopen consente di verificare se un CTRL+Z alla fine del file e la rimozione, se possibile.Questa operazione viene eseguita perché utilizzando fseek e ftell per spostarsi all'interno di un file che termina con CTRL+Z può causare fseek a comporta in modo errato alla fine del file.

In modalità testo, le combinazioni di ritorno a capo-avanzamento shopping vengono convertite in singoli avanzamenti riga in input e caratteri di avanzamento riga vengono tradotti alle combinazioni di ritorno a capo-avanzamento shopping in output.Quando una funzione Unicode stream-I/O viene eseguito in modalità testo (impostazione predefinita), l'origine o flusso di destinazione sia una sequenza di caratteri multibyte.Pertanto, le funzioni di flusso- input Unicode convertono i caratteri multibyte ai caratteri di tipo " wide " (ad esempio se da una chiamata alla funzione di mbtowc ).Per lo stesso motivo, le funzioni flusso- restituite Unicode convertono i caratteri di tipo " wide " per caratteri multibyte (ad esempio se da una chiamata alla funzione di wctomb ).

  • b
    Aprire in modalità (non tradotta binaria); le conversioni che includono il ritorno a capo e caratteri di avanzamento riga eliminati.

Se t o b non è modefornito in, la modalità di traduzione predefinita definita la variabile globale _fmode.Se t o b è provvisto all'argomento, la funzione ha esito negativo e restituisce NULL.

Per ulteriori informazioni su come utilizzare le modalità del binario e del testo in formato Unicode e in multibyte stream-I/O, vedere File di I/O modalità binario e del testo e Flusso I/O Unicode in modalità binario e del testo.

  • c
    Abilitare il flag di commit per filename collegata in modo da scrivere il contenuto del buffer di file direttamente su disco se fflush o _flushall viene chiamato.

  • n
    Reimpostare il flag di commit per filename collegato "NO primary commit." Impostazione predefinita.Esegue l'override del flag globale di commit se si collega il programma con COMMODE.OBJ.L'impostazione predefinita del flag globale del commit è "privi di" a meno che in modo esplicito accede il programma con COMMODE.OBJ (vedere) Opzioni di collegamento.

  • N
    Specifica che il file non è ereditato dai processi figlio.

  • S
    Specifica che la memorizzazione nella cache è ottimizzata, ma non limitata, per l'accesso sequenziale dal disco.

  • R
    Specifica che la memorizzazione nella cache è ottimizzata, ma non limitata, per l'accesso casuale dal disco.

  • T
    Specifica un file come temporaneo.Se possibile, non viene scaricata su disco.

  • D
    Specifica un file come temporaneo.Quando viene eliminato l'ultimo puntatore del file viene chiuso.

  • ccs=ENCODING
    Specifica il set di caratteri codificati per utilizzare (UTF-8, UTF-16LE, o UNICODE) per il file.Non consentito specificato se si desidera che la codifica ANSI.

I caratteri validi per mode stringa utilizzato in fopen e _fdopen corrisponde ad argomenti di oflag utilizzati in _open e in _sopen, come segue.

Caratteri della stringa in modalità

Valore equivalente di oflag per _open/_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

Nessuno

n

Nessuno

S

_O_SEQUENTIAL

R

_O_RANDOM

T

_O_SHORTLIVED

D

_O_TEMPORARY

ccs=UNICODE

_O_WTEXT

ccs=UTF-8

_O_UTF8

ccs=UTF-16LE

_O_UTF16

Se si utilizza la modalità di rb, non è necessario trasferire il codice e si desidera leggere la maggior parte delle dimensioni file o non si ha intenzione le prestazioni di rete, è inoltre necessario considerare se utilizzare file mappati memoria Win32 come opzione.

Requisiti

Funzione

Intestazione obbligatoria

fopen

<stdio.h>

_wfopen

<stdio.h> o <wchar.h>

Per ulteriori informazioni sulla compatibilità, vedere Compatibilità.

c, n, t, S, R, Te le opzioni di Dmode sono estensioni Microsoft per fopen e _fdopen e non devono essere utilizzati in cui la portabilità ANSI viene desiderata.

Esempio

Il seguente programma apre due file.Utilizza fclose per chiudere il primo file e _fcloseall per chiudere tutti i file rimanenti.

// crt_fopen.c
// compile with: /W3
// This program opens two files. It uses
// fclose to close the first file and
// _fcloseall to close all remaining files.

#include <stdio.h>

FILE *stream, *stream2;

int main( void )
{
   int numclosed;

   // Open for read (will fail if file "crt_fopen.c" does not exist)
   if( (stream  = fopen( "crt_fopen.c", "r" )) == NULL ) // C4996
   // Note: fopen is deprecated; consider using fopen_s instead
      printf( "The file 'crt_fopen.c' was not opened\n" );
   else
      printf( "The file 'crt_fopen.c' was opened\n" );

   // Open for write 
   if( (stream2 = fopen( "data2", "w+" )) == NULL ) // C4996
      printf( "The file 'data2' was not opened\n" );
   else
      printf( "The file 'data2' was opened\n" );

   // Close stream if it is not NULL 
   if( stream)
   {
      if ( fclose( stream ) )
      {
         printf( "The file 'crt_fopen.c' was not closed\n" );
      }
   }

   // All other files are closed: 
   numclosed = _fcloseall( );
   printf( "Number of files closed by _fcloseall: %u\n", numclosed );
}
  

Il seguente programma crea un file o sovrascritto se uno esistente, in modalità testo con codifica Unicode.Scrivere due stringhe nel file e chiudere il file.L'output è un file denominato _wfopen_test.xml, contenente i dati dalla sezione di output.

// crt__wfopen.c
// compile with: /W3
// This program creates a file (or overwrites one if
// it exists), in text mode using Unicode encoding.
// It then writes two strings into the file
// and then closes the file.
 
#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <wchar.h>

#define BUFFER_SIZE 50

int main(int argc, char** argv)
{
wchar_t str[BUFFER_SIZE];
size_t  strSize;
FILE*   fileHandle;

    // Create an the xml file in text and Unicode encoding mode.
    if ((fileHandle = _wfopen( L"_wfopen_test.xml",L"wt+,ccs=UNICODE")) == NULL) // C4996
    // Note: _wfopen is deprecated; consider using _wfopen_s instead
    {
        wprintf(L"_wfopen failed!\n");
        return(0);
    }

    // Write a string into the file.
    wcscpy_s(str, sizeof(str)/sizeof(wchar_t), L"<xmlTag>\n");
    strSize = wcslen(str);
    if (fwrite(str, sizeof(wchar_t), strSize, fileHandle) != strSize)
    {
        wprintf(L"fwrite failed!\n");
    }

    // Write a string into the file.
    wcscpy_s(str, sizeof(str)/sizeof(wchar_t), L"</xmlTag>");
    strSize = wcslen(str);
    if (fwrite(str, sizeof(wchar_t), strSize, fileHandle) != strSize)
    {
        wprintf(L"fwrite failed!\n");
    }

    // Close the file.
    if (fclose(fileHandle))
    {
        wprintf(L"fclose failed!\n");
    }
    return 0;
}

Equivalente .NET Framework

Vedere anche

Riferimenti

Flusso I/O

Interpretazione delle sequenze di caratteri multibyte

fclose, _fcloseall

_fdopen, _wfdopen

ferror

_fileno

freopen, _wfreopen

_open, _wopen

_setmode

_sopen, _wsopen