_fsopen, _wfsopen
Открывает поток с совместным доступом к файлу.
FILE *_fsopen(
const char *filename,
const char *mode,
int shflag
);
FILE *_wfsopen(
const wchar_t *filename,
const wchar_t *mode,
int shflag
);
Параметры
filename
Имя файла, который необходимо открыть.mode
Тип разрешенного доступа.shflag
Разрешенный тип совместного использования.
Возвращаемое значение
Каждая из этих функций возвращает указатель на поток. Значение указателя null обозначает ошибку. Если filename или mode равно NULL или является пустой строкой, эти функции вызывают обработчик недопустимого параметра, как описано в разделе Проверка параметров. Если продолжение выполнения разрешено, эти функции возвращают NULL и устанавливают для errno значение EINVAL.
Дополнительные сведения об этих и других кодах ошибок см. в разделе _doserrno, errno, _sys_errlist и _sys_nerr.
Заметки
Функция _fsopen открывает файл, указанный в filename, как поток, и готовит файл для последующих совместных чтения или записи, как определено режимом и аргументами shflag. _wfsopen — это версия функции _fsopen для расширенных символов; аргументы filename and mode для _wfsopen являются строками расширенных символов. В остальных случаях поведение _wfsopen и _fsopen идентично.
Символьная строка mode указывает тип доступа, который запрошен для файла, как показано в следующей таблице.
Термин |
Определение |
---|---|
"r" |
Открывает для чтения. Если файл не существует или его невозможно найти, вызов _fsopen завершается ошибкой. |
"w" |
Открывает пустой файл для записи. Если указанный файл существует, его содержимое удаляется. |
"a" |
Открывает для записи в конец файла (добавление); сначала создает файл, если он не существует. |
"r+" |
Открывает для чтения и записи. (Файл должен существовать.) |
"w+" |
Открывает пустой файл для чтения и записи. Если указанный файл существует, его содержимое удаляется. |
"a+" |
Открывает для чтения и добавления; сначала создает файл, если он не существует. |
Используйте типы "w" и "w+" с осторожностью, поскольку они могут удалить существующие файлы.
Если файл открывается с помощью типа доступа "a" или "a+", все операции записи выполняются в конце файла. Указатель файла может быть перемещен с помощью fseek или rewind, но он всегда возвращается в конец файла перед выполнением любой операции записи. Таким образом, невозможно перезаписать существующие данные. Если задан тип доступа "r+", "w+" или "a+", чтение и запись разрешены (считается, что файл открыт для обновления). Однако при переключении между чтением и записью должна быть промежуточная операция fsetpos, fseek или rewind. При необходимости, для операции fsetpos или fseek можно задать текущее положение. Помимо вышеуказанных значений, один из следующих символов можно включить в mode для определения режима преобразования для новых строк, а также для управления файлами.
Термин |
Определение |
---|---|
t |
Открывает файл в текстовом (преобразованном) режиме. В этом режиме сочетания символов возврата каретки и перевода строки переводятся в один символ перевода строки на входе, а символы перевода строки преобразуются на выходе в сочетания символов возврата каретки и перевода строки. Также CTRL+Z интерпретируется как символ конца файла на входе. В файлах, открытых для чтения или чтения/записи, _fsopen проверяет наличие CTRL+Z в конце файла и удаляет его, если это возможно. Это делается потому, что использование fseek и ftell для перемещения в файле, который заканчивается CTRL+Z, может вызвать неправильное поведение fseek ближе к концу файла. |
b |
Открывает файл в бинарном (непреобразованном) режиме; вышеописанные преобразования отключены. |
S |
Указывает, что кэширование оптимизировано для последовательного доступа с диска, но не ограничивается им. |
R |
Указывает, что кэширование оптимизировано для случайного доступа с диска, но не ограничивается им. |
T |
Определяет файл как временный. По возможности он не сбрасывается на диск. |
D |
Определяет файл как временный. Он удаляется, если закрывается последний указатель файла. |
Если t или b не указан в параметре mode, режим преобразования определяется переменной режима по умолчанию _fmode. Если символ t или b указан как префикс аргумента, функция завершается с ошибкой и возвращает NULL. Обсуждение текстового и бинарного режимов см. в разделе Text and Binary Mode File I/O.
Аргумент shflag это константное выражение, состоящее из одной из констант манифестов, указанных в Share.h.
Термин |
Определение |
---|---|
_SH_COMPAT |
Задает режим совместимости для 16 разрядных приложений. |
_SH_DENYNO |
Разрешает доступ на чтение и запись. |
_SH_DENYRD |
Запрещает доступ на чтение из файлу. |
_SH_DENYRW |
Запрещает доступ к файлу на чтение и запись. |
_SH_DENYWR |
Запрещает запись в файл. |
Универсальное текстовое сопоставление функций
Подпрограмма Tchar.h |
_UNICODE и _MBCS не определены |
_MBCS определено |
_UNICODE определено |
---|---|---|---|
_tfsopen |
_fsopen |
_fsopen |
_wfsopen |
Требования
Функция |
Обязательный заголовок |
Необязательные заголовки |
---|---|---|
_fsopen |
<stdio.h> |
<share.h> Для константы манифеста для параметра shflag. |
_wfsopen |
<stdio.h> или <wchar.h> |
<share.h> Для константы манифеста для параметра shflag. |
Пример
// crt_fsopen.c
#include <stdio.h>
#include <stdlib.h>
#include <share.h>
int main( void )
{
FILE *stream;
// Open output file for writing. Using _fsopen allows us to
// ensure that no one else writes to the file while we are
// writing to it.
//
if( (stream = _fsopen( "outfile", "wt", _SH_DENYWR )) != NULL )
{
fprintf( stream, "No one else in the network can write "
"to this file until we are done.\n" );
fclose( stream );
}
// Now others can write to the file while we read it.
system( "type outfile" );
}