Поделиться через


fopen, _wfopen

Файл будет открыт.Существуют более безопасные версии этих функций; см. раздел fopen_s, _wfopen_s.

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

Параметры

  • filename
    Имя файла.

  • mode
    Тип доступа, который включен.

Возвращаемое значение

Каждая из этих функций возвращает указатель к открытию файла.Указатель значение указывает на ошибку.Если filename или mode равен NULL или является пустой строкой, то эти функции активируют обработчик недопустимого параметра, как описано в разделе Проверка параметров.Если выполнение может быть продолжено, то функция возвращает NULL и устанавливает errno в EINVAL.

Для получения дополнительной информации см. errno, _doserrno, _sys_errlist и _sys_nerr.

Заметки

Функция fopen будет открыт файл, который задается параметром filename.версия _wfopen является fopen; аргументы для _wfopen характерные черты.В противном случае - _wfopen и fopen работают одинаково.Только с помощью _wfopen не влияет на закодированной кодировке, которая используется файлового потока.

fopen принимает пути, допустимые в файловой системе быть точки при выполнения; fopen принимает расположении и пути, содержащие подключенные сетевые диски, если система выполняет код имеет доступ к общей папке или сопоставленного диск во время выполнения.При построении пути для fopen, убедитесь, что драйвера, путь или сетевые папки будут доступны в среды выполнения.Можно использовать или символы обратной косой черты (/) или символы обратной косой черты (\) в качестве разделителей каталога в пути.

Всегда проверяйте возвращаемое значение, возникает ли указатель NULL до выполнения любых дальнейшее операции в файле.При возникновении ошибки, глобальная переменная errno устанавливается и может использоваться для получения конкретные сведения об ошибке.Для получения дополнительной информации см. errno, _doserrno, _sys_errlist и _sys_nerr.

Поддержка Юникода

fopen поддерживает файловых потоков юникода.Чтобы открыть файл в формате юникод, передайте флажок ccs, который определяет новое код в fopen следующим образом.

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

Допустимые значения: encoding, UTF-8, UNICODE и UTF-16LE.

Если файл уже существует и открыт для чтения или добавить, метки порядка байтов (BOM), если он присутствует в файле, задает кодирование.Кодирование спецификации имеет приоритет перед кодированием, определенное флажком ccs.Кодирование ccs используется, если только не спецификация отсутствует или файл новый файл.

ПримечаниеПримечание

Обнаружение спецификации применяется только к файлам, которые будут открываться юникода (т е путем передачи флажок ccs ).

В следующей таблице приведены режимы, которые используются для различных флажков ccs, присвоенное fopen и меток порядка байтов в файле.

Кодирования используется на основе флажке и спецификации ccs

Флаг ccs

Нет спецификации (или нового файла)

Спецификация: UTF-8

Спецификация: 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

Файлы раскрытые для записи в режиме юникода имеет спецификацию XML на них автоматически.

Если mode "a, ccs=<encoding>", то fopen сначала пытается открыть файл с обоими чтения и записи.Если это завершается успешно, то функция считывает спецификацию для определения кода для файла; если это происходит, функция использует кодирование по умолчанию для файлов.В любом случае, fopen затем снова откроет файл доступен только с доступом на запись.(Это применяется к режим a, а не только в режиме a+).

Универсальное текстовое сопоставление функций

Функция TCHAR.H

неопределенные _UNICODE & _MBCS

определенные _MBCS

Определение _UNICODE

_tfopen

fopen

fopen

_wfopen

Символьная строка mode указывает тип доступа, который запрошен для файла следующим образом.

  • "r"
    Открывает для чтения.Если файл не существует или не найдено, то вызов fopen завершается с ошибкой.

  • "w"
    Открывается пустой файл для записи.Если указанный файл существует, то его содержимое удаляется.

  • "a"
    Открывает для записи в конце файла (добавление) без удаления маркер (EOF) - элемент файла до новых данных будет записан в файл.Создает файл, если он не существует.

  • "r+"
    Будет открыт как для чтения, так и для записи.Файл должен существовать.

  • "w+"
    Открывается пустой файл как для чтения, так и для записи.Если файл существует, то его содержимое удаляется.

  • "a+"
    Открывает для чтения и добавить.При добавлении операция включает в себя удаление маркера конца файла) до новые данные записываются в файл.Маркер конца файла) не восстанавливается после завершения записи.Создает файл, если он не существует.

Когда файл открывается с помощью типа "a" или типа доступа доступа "a+", все операции записи выполняются в конце файла.Указатель файла может быть перемещен с помощью fseek или rewind, но всегда перемещен обратно в конец файла, прежде чем записывают любые операции унесены.Поэтому невозможно перезаписать существующие данные.

Режим "a" не удаляет маркер конца файла), прежде чем он добавляет в файл.После добавления выполняется команда ТИПА MS-DOS отображаются только данные до первоначальной разметки, не любых данных добавленных конца файла) к файлу.Прежде чем добавляются в файл, режим "a+" удаляет маркер конца файла).После добавления команда ТИПА MS-DOS отображаются все данные в файле.Режим "a+" необходим для добавления в файл потока, завершен с маркером CTRL+Z конца файла).

Когда определено "r+", "w+" или тип доступа "a+", и чтение и запись разрешены (считается, что будет открыт файл "для обновления").Однако при переходе от чтения к написанию, операция ввода должна получить маркер конца файла).Если нет конца файла), необходимо использовать в вызов функции размещения файла.Функции размещения файла fsetpos, fseek и rewind.При переключении из запись чтения, необходимо использовать в вызов fflush или функции размещения файла.

В дополнение к предыдущим более значений, следующие символы можно добавить в mode, чтобы указать режим для перевода символов новой строки.

  • t
    Открыть в режиме (переведенного текста).В этом режиме CTRL+Z, интерпретируется как символ конца файла) на входе.В файлах, открыт для чтения/записи с помощью "a+", fopen проверяет наличие CTRL+Z в конце файла и удаляет его, если это возможно.Это сделано потому, что использовать fseek и ftell для перемещения в файле, который заканчивается CTRL+Z может вызвать fseek работать неправильно ближе к концу файла.

В режиме текста, сочетания RETURN- перевода строки экипажа переведены в одиночные переводы строк на входе и символы перевода строки изменены на сочетаниями RETURN- перевода строки экипажа на выходе.Если функция юникода stream-I/O работает в режиме текста (по умолчанию), источник или предполагается, что будет поток назначения последовательностью многобайтовых символов.Поэтому функции потока входных данных преобразования юникода символы многобайтовой к расширенным символы (если при вызове функции mbtowc ).По этой же причине функции потока вывода преобразование расширенных символов юникода на символы многобайтовой (если при вызове функции wctomb ).

  • b
    Открыть в бинарном (непреобразованный) режиме; переводы, символы возврата каретки и перевода строки отключены.

Если t или b не дается в mode, то режим преобразования по умолчанию определяется глобальной переменной _fmode.Если t или b указывается буква к аргументу, функция завершается неудачей и возвращает NULL.

Дополнительные сведения об использовании режимы текста и бинарный в юникоде и многобайтовой stream-I/O см. в разделах ВВОДА-ВЫВОДА текста и файла режим бинарный и Поток ВВОДА-ВЫВОДА в юникоде в режимах текста и бинарный.

  • c
    Включите флажок фиксации для связанного объекта filename, чтобы содержимое файлового буфера будут записываются непосредственно на диск, если fflush или _flushall вызываются.

  • n
    Сбросьте флажок фиксации для связанного объекта filename "," фиксации. Задано по умолчанию.Она также переопределяет глобальный флажок фиксации при соединении программы с COMMODE.OBJ.Глобальное значение по умолчанию флажка фиксации ", фиксация", если явно не рассматривается связывание программы с COMMODE.OBJ (см. Параметры соединения).

  • N
    Указывает, что файл не наследуется дочерними процессами.

  • S
    Указывает, что помещающ кэширование оптимизирует, но не для ограничения, последовательный с диска.

  • R
    Указывает, что помещающ кэширование оптимизирует, но не для ограничения, прямой доступ с диска.

  • T
    Определяет, как временный файл.Если возможно, он не потоплен на диск.

  • D
    Определяет, как временный файл.Он удаляется, когда последний указатель файла закрыт.

  • ccs=ENCODING
    Определяет закодированную кодировки для использования (UTF-8, UTF-16LE или UNICODE) для этого файла.Оставьте неуказанным при необходимости кодирование ANSI.

Допустимые символы для строки mode, используемую в fopen и _fdopen соответствуют аргументам oflag, которые используются в _open и _sopen следующим образом.

Символы в строке режима

Эквивалентно oflag значение _open или _sopen

a

_O_WRONLY | _O_APPEND(обычно это _O_WRONLY | _O_CREAT | _O_APPEND)

a+

_O_RDWR | _O_APPEND (обычно это _O_RDWR | _O_APPEND | _O_CREAT)

r

_O_RDONLY

r+

_O_RDWR

w

_O_WRONLY (обычно это _O_WRONLY | _O_CREAT | _O_TRUNC)

w+

_O_RDWR (обычно это _O_RDWR | _O_CREAT | _O_TRUNC)

b

_O_BINARY

t

_O_TEXT

c

None

n

None

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

Если используется режим rb, не сделать код порта, и ожидается для чтения большинство большого файла или не беспокойство о сетевой производительности следует также учитывать могут ли использование памяти сопоставленной файлов Win32 в качестве параметра.

Требования

Функция

Требуемый заголовок

fopen

<stdio.h>

_wfopen

<stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Совместимость.

c, n, t, S, R, T и Dmode расширения Майкрософт для fopen и _fdopen и не должны использоваться, переносимость ANSI пожелана.

Пример

Следующая программа открывает 2 файла.Он использует fclose, чтобы закрыть первый файл и _fcloseall, чтобы закрыть все остальные файлы.

// 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 );
}
  

Следующая программа создает файл (или перезаписать его, если он существует), в режиме текста с кодирования юникода.Затем он записывает 2 строк в файл и закрывает файл.Выходные данные _wfopen_test.xml файл с именем, которое содержит данные из раздела.

// 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;
}

Эквивалент в .NET Framework

См. также

Ссылки

Поток ВВОДА-ВЫВОДА

Интерпретация последовательностей многобайтового символов

fclose, _fcloseall

_fdopen, _wfdopen

ferror

_fileno

freopen, _wfreopen

_open, _wopen

_setmode

_sopen, _wsopen