_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
и n
mode
параметры — это расширения Майкрософт для fopen
и_fdopen
. c
Не используйте их, если вы хотите сохранить переносимость ANSI.
Если t
или b
нет mode
, режим перевода по умолчанию определяется глобальной переменной _fmode
. Если символ t
или b
указан как префикс аргумента, функция завершается с ошибкой и возвращает NULL
. Обсуждение текстовых и двоичных режимов см. в разделе "Текст" и "Двоичный режим" в файле ввода-вывода.
Допустимые символы строки, используемой fopen
mode
в и _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 |
нет |
Требования
Function | Обязательный заголовок | Заголовок 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