_fdopen, _wfdopen

Связывает поток с файлом, который ранее был открыт для низкоуровневого ввода-вывода.

Синтаксис

FILE *_fdopen(
   int fd,
   const char *mode
);
FILE *_wfdopen(
   int fd,
   const wchar_t *mode
);

Параметры

fd
Дескриптор открытого файла.

mode
Тип доступа к файлу.

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

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

Дополнительные сведения об этих и других кодах ошибок см. в разделе errno, _doserrnoи _sys_errlist_sys_nerr.

Замечания

Функция _fdopen связывает поток ввода-вывода с файлом, который определяется параметром fd, таким образом обеспечивая возможность буферизации и форматирования файла, открытого для низкоуровневого ввода-вывода. _wfdopen — это версия _fdopenс расширенными символами; аргумент mode для _wfdopen — строка расширенных символов. В остальных отношениях поведение функций _wfdopen и _fdopen идентично.

Дескрипторы файлов, передаваемые в _fdopen , принадлежат возвращаемого FILE * потока. В случае _fdopen успешного выполнения не вызывайте _close дескриптор файла. Вызов fclose возвращаемого FILE * файла также закрывает дескриптор файла.

По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить его, ознакомьтесь с глобальным состоянием в CRT.

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

mode Открыть
"r" Открывает для чтения. Если файл не существует или не удается найти, вызов завершается ошибкой fopen .
"w" Открывает пустой файл для записи. Если указанный файл существует, его содержимое удаляется.
"a" Открывается для записи в конце файла (добавление). Создает файл, если он не существует.
"r+" Открывает для чтения и записи. Файл должен существовать.
"w+" Открывает пустой файл для чтения и записи. Если файл существует, его содержимое удаляется.
"a+" Открывается для чтения и добавления. Создает файл, если он не существует.

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

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

mode Модификатор Поведение
t Откройте файл в текстовом (переведенном) режиме. В этом режиме сочетания символов возврата каретки и перевода строки (CR-LF) преобразуются в один символ перевода строки (LF) на входе, а символы перевода строки (LF) преобразуются на выходе в сочетания символов возврата каретки и перевода строки (CR-LF). Кроме того, на входе Ctrl+Z интерпретируется как символ конца файла.
b Открыть в двоичном (непреобразованном) режиме. Все преобразования из режима t отключены.
c Включите флажок фиксации для связанного объекта filename , чтобы содержимое файлового буфера записывалось непосредственно на диск при вызове fflush или _flushall .
n Сброс флага фиксации для связанного filename с "no-commit". Этот флаг по умолчанию. Он также переопределяет глобальный флаг фиксации, если вы связываете программу с Commode.obj. Флаг глобальной фиксации по умолчанию — "no-commit", если вы явно не связываете программу с Commode.obj.

Параметры t, c и nmode являются расширениями Майкрософт для функций fopen и _fdopen. Не используйте их, если вы хотите сохранить переносимость ANSI.

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

Допустимые символы строки, используемой fopenmode в и _fdopen соответствующие oflag аргументам, используемым _open в и_sopen, как показано в следующей таблице:

Символы в строке mode Эквивалентное 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

Требования

Функция Обязательный заголовок Заголовок C++
_fdopen <stdio.h> <cstdio>
_wfdopen <stdio.h> или <wchar.h> <cstdio>

Дополнительные сведения о соответствии стандартам и соглашениях об именовании в библиотеке среды выполнения C см. в разделе "Совместимость".

Сопоставления подпрограмм универсального текста

<tchar.h> Обычной _UNICODE и _MBCS не определен _MBCS Определенные _UNICODE Определенные
_tfdopen _fdopen _fdopen _wfdopen

Пример

// crt_fdopen.c
// This program opens a file by using low-level
// I/O, then uses _fdopen to switch to stream
// access. It counts the lines in the file.

#include <stdlib.h>
#include <stdio.h>
#include <fcntl.h>
#include <io.h>
#include <share.h>

int main( void )
{
   FILE *stream;
   int  fd, count = 0;
   char inbuf[128];

   // Open a file.
   if( _sopen_s( &fd, "crt_fdopen.txt", _O_RDONLY, _SH_DENYNO, 0 ) )
      exit( 1 );

   // Get stream from file descriptor.
   if( (stream = _fdopen( fd, "r" )) == NULL )
      exit( 1 );

   while( fgets( inbuf, 128, stream ) != NULL )
      count++;

   // After _fdopen, close by using fclose, not _close.
   fclose( stream );
   printf( "Lines in file: %d\n", count );
}

Входные данные: crt_fdopen.txt

Line one
Line two

Выходные данные

Lines in file: 2

См. также

Потоковый ввод-вывод
_dup, _dup2
fclose, _fcloseall
fopen, _wfopen
freopen, _wfreopen
_open, _wopen