Как получить указатель на ФАЙЛ из файлового дескриптора?


86

Я играю с mkstemp(), который предоставляет дескриптор файла, но я хочу генерировать форматированный вывод через fprintf(). Есть ли простой способ преобразовать файловый дескриптор, предоставленный mkstemp()в FILE *структуру, подходящую для использования fprintf()?


Ответы:


103

Использование fdopen():


34
А чтобы получить дескриптор файла из ФАЙЛА *, используйте fileno(): linux.die.net/man/3/fileno
Ли Нетертон

2
если fdоткрывался с некоторыми флагами (вроде O_NONBLOCK) - что с ними будет после fdopenоткрытия с новыми флагами? Будут ли они xorобъединены или заменены?
xealits

5
@jww: файловые дескрипторы изначально не соответствуют стандарту ANSI C.
Rufflewind

2
это плохо в любом случае звонить fdopenнесколько раз? (при условии, что это происходит внутри некоторой функции, которая
вызывается

2
@xealits Параметры ФАЙЛА * должны находиться в пределах уже открытого файлового дескриптора. Поэтому, если вы открыли fd только для чтения, а FILE * только для записи, он должен выдать исключение. Для получения дополнительной информации см ibm.com/support/knowledgecenter/en/SSLTBW_2.2.0/...
Tjad Кларк

28

FILE* f = fdopen(d, "w");

вывод man fdopen:

ОБЗОР

fdopen()Функция связывает поток с существующим описателем файла fildes. Режим потока должен быть совместим с режимом дескриптора файла. Когда поток закрыт через fclose(3), fildesтакже закрывается.


1
Недоступно в ANSI C.
jww

Для большей ясности см ibm.com/support/knowledgecenter/en/SSLTBW_2.2.0/...
Tjad Кларк

-8

Не существует стандартного способа сделать это (или наоборот), поскольку стандарт C ничего не говорит о дескрипторах файлов. Ваша конкретная платформа может предоставлять или не предоставлять такой механизм.


17
Зависит от того, что вы подразумеваете под «стандартом». POSIX - это стандарт.
Ричард Пеннингтон,

12
Вопрос был о файловых дескрипторах. ;-)
Ричард Пеннингтон

11
@Neil> вопрос, помеченный как C, не означает «скажите мне всю правду о стандарте C», а скорее «я кодирую на C, у меня не получается это сделать, пожалуйста, скажите мне, возможно ли это и как? "
Грегори Пакош

8
Я согласен с тем, что стандартного способа сделать это нет, но упоминание OP mkstempподразумевает, что нестандартные решения приемлемы в данном конкретном случае. В этом случае, однако, он должен был добавить posixтег (который, как я вижу, с тех пор был добавлен).
Эмерик Рогул

9
@Neil, и цель Сети, и смысл жизни. Было бы больше смысла, если бы вы сказали, что придерживаетесь другого мнения. Я также сомневаюсь, что SO - это все, что касается стандартов. И не очень практично полагаться на навыки маркировки кого-то с SO-опытом, соответствующим репутации 23.
Майкл Крелин - хакер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.