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

86

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

BD в Ривенхилле
источник

Ответы:

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.
Майкл Крелин - хакер