Jak uzyskać wskaźnik FILE z deskryptora pliku?


85

Bawię się mkstemp(), co zapewnia deskryptor pliku, ale chcę wygenerować sformatowane dane wyjściowe za pośrednictwem fprintf(). Czy istnieje łatwy sposób przekształcenia deskryptora pliku dostarczonego przez program mkstemp()w FILE *strukturę, której można używać fprintf()?


Odpowiedzi:


101

Zastosowanie fdopen():

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

34
Aby uzyskać deskryptor pliku z PLIKU *, użyj fileno(): linux.die.net/man/3/fileno
Lee Netherton,

2
jeśli fdzostał otwarty z niektórymi flagami (jak O_NONBLOCK) - co się z nimi stanie po fdopenotwarciu z nowymi flagami? Czy zostaną xorpołączone czy zastąpione?
xealits

5
@jww: Deskryptory plików nie są w formacie ANSI C.
Rufflewind

2
czy w jakikolwiek sposób jest źle dzwonić fdopenwiele razy? (zakładając, że dzieje się to wewnątrz jakiejś funkcji, która jest
ciągle wywoływana

2
@xealits Opcje PLIKU * muszą mieścić się w zakresie już otwartego deskryptora pliku. Więc jeśli otworzyłeś fd tylko do odczytu, a PLIK * tylko do zapisu, powinien zgłosić wyjątek. Więcej informacji można znaleźć na stronie ibm.com/support/knowledgecenter/en/SSLTBW_2.2.0/…
Tjad Clark

28

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

man fdopen wyjście:

STRESZCZENIE

#include <stdio.h>

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

fdopen()Funkcja wiąże strumień z istniejącym deskryptorze pliku fildes. Tryb strumienia musi być zgodny z trybem deskryptora pliku. Kiedy strumień jest zamknięty przez fclose(3), fildesjest również zamknięty.


1
Niedostępne w ANSI C.
jww


-8

Nie ma standardowego sposobu, aby to zrobić (lub odwrotnie), ponieważ standard C nie ma nic do powiedzenia na temat deskryptorów plików. Twoja konkretna platforma może lub nie zapewniać takiego mechanizmu.


17
Zależy od tego, co rozumiesz przez „standard”. POSIX to standard.
Richard Pennington,

12
Pytanie dotyczyło deskryptorów plików. ;-)
Richard Pennington

11
@Neil> pytanie oznaczone jako C nie oznacza „powiedz mi całą prawdę o standardzie C”, ale raczej „Koduję w C, nie udaje mi się to, proszę mi powiedzieć, czy jest to możliwe i jak? "
Gregory Pakosz

8
Zgadzam się, że nie ma na to standardowego sposobu, ale wzmianka w OP mkstempsugeruje, że niestandardowe rozwiązania są dopuszczalne w tym konkretnym przypadku. W takim przypadku jednak powinien był dodać posixtag (który, jak widzę, został już dodany).
Emerick Rogul

9
@Neil oraz cel sieci i sens życia. Miałbyś więcej sensu, gdybyś powiedział, że masz inne zdanie. Wątpię też, żeby w SO chodziło o rozwiązywanie włosów nad standardami. I nie jest zbyt praktyczne poleganie na oznaczaniu umiejętności kogoś z doświadczeniem SO odpowiadającym reputacji 23.
Michael Krelin - haker
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.