_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
или есть NULL
или mode
пустая строка, эти функции вызывают обработчик недопустимых параметров, как описано в разделе проверки параметров. Если продолжение выполнения разрешено, эти функции возвращают NULL
и устанавливают для errno
значение EINVAL
.
Дополнительные сведения об этих и других кодах ошибок см. в разделе errno
, _doserrno
и _sys_errlist
_sys_nerr
.
Замечания
Функция _fsopen
открывает файл, указанный в параметре filename
, в качестве потока и готовит файл для последующих операций чтения или записи с общим доступом, как определено режимом и аргументами shflag
. _wfsopen
— это версия функции _fsopen
для расширенных символов; аргументы filename
и 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 |
Открывает файл в текстовом режиме (с преобразованием). В этом режиме сочетания канала возврата каретки (CR-LF) превратятся в однострочные каналы (LF) для входных и символов LF переводятся в сочетания cr-LF для выходных данных. Кроме того, при вводе символ CTRL+Z интерпретируется как символ конца файла. В файлах, открытых для чтения или чтения/записи, функция _fsopen проверяет наличие символа CTRL+Z в конце файла и удаляет его, если это возможно. Он удален из-за использования fseek и ftell перемещения в файл, который заканчивается сочетанием клавиш CTRL+Z, может привести fseek к неправильному ведении в конце файла. |
b |
Открывает файл в двоичном (непреобразованном) режиме; вышеописанные преобразования отключены. |
D |
Указывает временный файл, который удаляется при закрытии последнего указателя файла. |
R |
Указывает, что кэширование оптимизировано для случайного доступа с диска, но не ограничивается им. |
S |
Указывает, что кэширование оптимизировано для последовательного доступа с диска, но не ограничивается им. |
T |
Указывает файл, который не записывается на диск, если это не требуется. |
Если t
или b
нет mode
, режим перевода определяется переменной _fmode
режима по умолчанию. Если символ t
или b
указан как префикс аргумента, функция завершается с ошибкой и возвращает NULL
. Обсуждение текстовых и двоичных режимов см. в разделе "Текст" и "Двоичный режим" в файле ввода-вывода.
Относительно T
и D
:
T
избегает записи файла на диск до тех пор, пока не требуется давление на память. Дополнительные сведения см. в разделеFILE_ATTRIBUTE_TEMPORARY
"Константы атрибутов файла", а также в этой записи блога Только временный.D
указывает обычный файл, записанный на диск. Разница заключается в том, что он автоматически удаляется при закрытии. Вы можете объединить обаTD
семантики.
_fsopen
и _wfsopen
являются вариантами, определенными fopen
корпорацией Майкрософт. Они не являются частью стандарта ANSI. Для более переносимой и безопасной функции, если вам не требуется общий доступ к файлам, рассмотрите _wfopen_s
или fopen_s
.
Аргумент shflag
— это константное выражение, состоящее из одной из следующих констант манифеста, определенных в Share.h
.
Термин | Определение |
---|---|
_SH_DENYNO |
Разрешает доступ на чтение и запись. |
_SH_DENYRD |
Запрещает доступ к файлу для чтения. |
_SH_DENYRW |
Запрещает доступ к файлу для чтения и записи. |
_SH_DENYWR |
Запрещает доступ к файлу для записи. |
По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить это поведение, см . статью "Глобальное состояние" в CRT.
Сопоставления подпрограмм универсального текста
Tchar.h рутина |
_UNICODE и _MBCS не определен |
_MBCS Определенные |
_UNICODE Определенные |
---|---|---|---|
_tfsopen |
_fsopen |
_fsopen |
_wfsopen |
Требования
Function | Обязательный заголовок | Необязательные заголовки |
---|---|---|
_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" );
}
No one else in the network can write to this file until we are done.
См. также
Потоковый ввод-вывод
fclose
, _fcloseall
_fdopen
, _wfdopen
ferror
_fileno
fopen
, _wfopen
freopen
, _wfreopen
_open
, _wopen
_setmode
_sopen
, _wsopen