2009-12-21 22 views
57

Ich spiele herum mit mkstemp(), die einen Dateideskriptor bietet, aber ich möchte formatierte Ausgabe über fprintf() generieren. Gibt es eine einfache Möglichkeit, den von mkstemp() bereitgestellten Dateideskriptor in eine FILE * -Struktur zu transformieren, die für die Verwendung mit fprintf() geeignet ist?Wie bekomme ich einen FILE-Zeiger von einem Dateideskriptor?

+3

Und das Gegenteil: [Wie kann ich einen Dateizeiger (FILE *) in einen Dateideskriptor (fd) konvertieren?] (Http://stackoverflow.com/questions/3167298/how-can-i-convert-a -file-pointer-file-to-a-file-deskriptor-fd) –

Antwort

75

Verwenden fdopen():

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

Und um den Dateideskriptor von einer FILE zu bekommen * benutze 'fileno()': http://linux.die.net/man/3/fileno –

+1

wenn 'fd' mit einigen Flags (wie' O_NONBLOCK') geöffnet wurde - was passiert mit ihnen nachdem 'fdopen' es mit neuen Flags öffnet? Werden sie zusammen oder ersetzt werden? – xealits

+0

Nicht verfügbar in ANSI C. – jww

23

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

Mann fdopen output:

SYNOPSE

#include <stdio.h> 

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

Die Funktion fdopen() ordnet einen Stream dem vorhandenen Dateideskriptor fildes zu. Der Modus des Streams muss mit dem Modus des Dateideskriptors kompatibel sein. Wenn der Stream über fclose(3) geschlossen wird, ist auch fildes geschlossen.

+1

Nicht verfügbar in ANSI C. – jww

+0

Für mehr Klarheit, siehe https://www.ibm.com/support/knowledgecenter/en/SSLTBW_2.2.0/com.ibm.zos.v2r2.bpxbd00/rtfdo.htm –

-7

Es gibt keine Standardmethode, dies zu tun (oder umgekehrt), da der C-Standard nichts über Dateideskriptoren zu sagen hat. Ihre spezielle Plattform kann einen solchen Mechanismus bereitstellen oder nicht.

+15

Hängt davon ab, was Sie mit "Standard" meinen. POSIX ist ein Standard. –

+1

Die Frage war etwa C. –

+5

obwohl, die fdopen() - Funktion entspricht IEEE Std 1003.1-1988 ("POSIX.1"). –