Як отримати вказівник на ФАЙЛ із дескриптора файлу?


85

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


Відповіді:


101

Використання fdopen():

FILE* fp = fdopen(fd, "w");

34
А щоб отримати дескриптор файлу з ФАЙЛУ *, використовуйте fileno(): linux.die.net/man/3/fileno
Lee Netherton

2
якщо fdбуло відкрито з деякими прапорцями (наприклад O_NONBLOCK) - що буде з ними після того, як fdopenвідкриється з новими прапорами? Чи будуть вони xor-ed разом або замінені?
xealits

5
@jww: Дескриптори файлів для початку не є ANSI C.
Rufflewind

2
чи погано якось дзвонити fdopenкілька разів? (припускаючи, що це відбувається всередині якоїсь функції, яка викликається знову і знову)
phil294

2
@xealits Параметри ФАЙЛУ * повинні знаходитися в межах вже відкритого дескриптора файлу. Отже, якщо ви відкрили fd лише для читання, а FILE * - лише для запису, він повинен видавати виняток. Для отримання додаткової інформації зверніться до ibm.com/support/knowledgecenter/en/SSLTBW_2.2.0/…
Tjad Clark

28

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

man fdopen output:

КОНТРОЛЬ

#include <stdio.h>

FILE *
fdopen(int fildes, const char *mode);

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


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

Для більшої ясності зверніться до ibm.com/support/knowledgecenter/en/SSLTBW_2.2.0/…
Tjad Clark

-8

Існує не стандартний спосіб зробити це (або навпаки), оскільки стандарт C не має нічого сказати про дескриптори файлів. Ваша конкретна платформа може передбачати такий механізм, а може і не надавати його.


17
Залежить від того, що ви маєте на увазі під словом "стандарт". POSIX - це стандарт.
Річард Пеннінгтон,

12
Питання стосувалося дескрипторів файлів. ;-)
Річард Пеннінгтон,

11
@Neil> запитання, позначене як C, не означає "скажи мені святу правду про стандарт C", а "Я кодую на C, мені це не вдається, скажіть, будь ласка, чи можливо це і як? "
Грегорі Пакош

8
Я погоджуюсь з тим, що не існує стандартного способу зробити це, але згадка ОП mkstempпередбачає, що нестандартні рішення прийнятні саме в цьому конкретному випадку. Однак у такому випадку він повинен був додати posixтег (який, на мою думку, з тих пір був доданий).
Емерік Рогул

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