¿Cómo obtener un puntero de ARCHIVO de un descriptor de archivo?


85

Estoy jugando con mkstemp(), que proporciona un descriptor de archivo, pero quiero generar una salida formateada a través de fprintf(). ¿Existe una manera fácil de transformar el descriptor de archivo proporcionado por mkstemp()en una FILE *estructura que sea adecuada para su uso fprintf()?


Respuestas:


101

Utilizar fdopen():

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

34
Y para obtener el descriptor de archivo de un ARCHIVO * use fileno(): linux.die.net/man/3/fileno
Lee Netherton

2
si fdse abrió con algunas banderas (como O_NONBLOCK), ¿qué pasará con ellas después de que se fdopenabra con nuevas banderas? ¿Serán xorsustituidos o juntos?
xealits

5
@jww: Para empezar, los descriptores de archivo no son ANSI C.
Rufflewind

2
¿Es malo de alguna manera llamar fdopenvarias veces? (asumiendo que sucede dentro de alguna función que se llama una y otra vez)
phil294

2
@xealits Las opciones para el ARCHIVO * deben estar dentro del alcance del descriptor de archivo ya abierto. Entonces, si ha abierto fd con solo lectura y el ARCHIVO * con solo escritura, debería lanzar una excepción. Para obtener más información, consulte ibm.com/support/knowledgecenter/en/SSLTBW_2.2.0/…
Tjad Clark

28

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

man fdopen salida:

SINOPSIS

#include <stdio.h>

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

La fdopen()función asocia un flujo con el descriptor de archivo existente, fildes. El modo de la secuencia debe ser compatible con el modo del descriptor de archivo. Cuando el arroyo se cierra vía fclose(3), fildestambién se cierra.


1
No disponible en ANSI C.
jww

Para obtener más claridad, consulte ibm.com/support/knowledgecenter/en/SSLTBW_2.2.0/…
Tjad Clark

-8

No hay una forma estándar de hacer esto (o al revés) ya que el Estándar C no tiene nada que decir sobre los descriptores de archivos. Su plataforma específica puede proporcionar o no dicho mecanismo.


17
Depende de lo que quiera decir con "estándar". POSIX es un estándar.
Richard Pennington

12
La pregunta era sobre descriptores de archivos. ;-)
Richard Pennington

11
@Neil> la pregunta etiquetada como C no significa "dime la verdad sobre el estándar C", sino más bien "Estoy codificando en C, no lo hago, por favor dime si es posible y cómo. "
Gregory Pakosz

8
Estoy de acuerdo en que no hay una forma estándar de hacer esto, pero la mención del OP mkstempimplica que las soluciones no estándar son aceptables en este caso particular. En ese caso, sin embargo, debería haber agregado la posixetiqueta (que veo que ya se agregó).
Emerick Rogul

9
@Neil, y el propósito de la Red y el significado de la vida. Tendría más sentido si dijera que tiene una opinión diferente. También dudo que SO se trate de burlarse de los estándares. Y no es muy práctico confiar en las habilidades de etiquetado de alguien con una experiencia de SO correspondiente a la reputación de 23.
Michael Krelin - hacker
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.