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


_fdopen, _wfdopen

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

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

Параметры

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

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

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

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

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

Заметки

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

Универсальное текстовое сопоставление функций

Подпрограмма Tchar.h

_UNICODE и _MBCS не определены

_MBCS определено

_UNICODE определено

_tfdopen

_fdopen

_fdopen

_wfdopen

Символьная строка mode определяет тип файла и доступа к файлу.

Символьная строка mode указывает тип доступа, который запрошен для файла, как показано в следующей таблице.

  • "r"
    Открывает для чтения. Если файл не существует или его невозможно найти, вызов fopen завершается ошибкой.

  • "w"
    Открывает пустой файл для записи. Если указанный файл существует, его содержимое удаляется.

  • "a"
    Открывает для записи, в конце файла (добавление). Создает файл, если он не существует.

  • "r+"
    Открывает для чтения и записи. (Файл должен существовать.)

  • "w+"
    Открывает пустой файл для чтения и записи. Если указанный файл существует, его содержимое удаляется.

  • "a+"
    Открывается для чтения и добавления. Создает файл, если он не существует.

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

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

  • t
    Открыть файл в текстовом (переведенном) режиме. В этом режиме сочетания символов возврата каретки и перевода строки переводятся в один символ перевода строки на входе, а символы перевода строки преобразуются на выходе в сочетания символов возврата каретки и перевода строки. Также Ctrl+Z интерпретируется как символ конца файла на входе. В файлах, открытых для чтения или записи с помощью fopen, проверяет наличие CTRL+Z в конце файла и удаляет его, если это возможно. Это делается потому, что использование функций fseek и ftell для перемещения в файле, который заканчивается CTRL+Z, может вызвать неправильное поведение fseek ближе к концу файла.

  • b
    Открыть в бинарном (непреобразованном) режиме. Все преобразования из режима t отключены.

  • c
    Включить флажок фиксации для связанного объекта filename, чтобы содержимое файлового буфера записывалось непосредственно на диск при вызове fflush или _flushall.

  • n
    Сбросить флажок фиксации для связанного объекта filename, задать для него значение "без фиксации". Это значение по умолчанию. Оно также переопределяет глобальный флаг фиксации при соединении программы с Commode.obj. Значение по умолчанию глобального флага фиксации — "без фиксации", если только программа не связана явно с файлом Commode.obj.

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

Если символ t или b в параметре mode не указан, режим преобразования по умолчанию определяется глобальной переменной _fmode. Если символ t или b указан как префикс аргумента, функция завершается с ошибкой и возвращает NULL. Обсуждение текстового и бинарного режимов см. в разделе Text and Binary Mode File I/O.

Допустимые символы для строки mode, используемой в fopen и _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

Нет

n

Нет

Требования

Функция

Обязательный заголовок

_fdopen

<stdio.h>

_wfdopen

<stdio.h> или <wchar.h>

Дополнительные сведения о совместимости см. в разделе Совместимость.

Пример

// 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

Output

Lines in file: 2

Эквивалент в .NET Framework

System::IO::FileStream::FileStream

См. также

Ссылки

Потоковый ввод-вывод

_dup, _dup2

fclose, _fcloseall

fopen, _wfopen

freopen, _wfreopen

_open, _wopen