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


_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+" Открывается для чтения и добавления; сначала создает файл, если он не существует.

Используйте типы "" и "ww+" с осторожностью, так как они могут уничтожить существующие файлы.

При открытии файла с типом доступа "a" или "a+" все операции записи выполняются в конце файла. Указатель на файл можно изменить положение с помощью fseek или rewind, но он всегда перемещается обратно в конец файла перед выполнением любой операции записи. Таким образом, существующие данные не могут быть перезаписаны. Если указан тип доступа "r+,", w+"" или "a+", разрешено чтение и запись (файл, как утверждается, открыт для обновления). Однако при переключении между чтением и записью необходимо выполнить взаимодействие fsetposfseekили 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

Требования

Функция Обязательный заголовок Необязательные заголовки
_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