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
System::IO::FileStream::FileStream