_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