Recuperando descriptor de archivo de std :: fstream

Posible duplicado:
Obteniendo un ARCHIVO * desde un std :: fstream

Estoy trabajando en Linux y los descriptores de archivos son el modelo principal en este sistema operativo.

Me preguntaba si hay alguna biblioteca o alguna forma de recuperar el descriptor de archivo nativo de Linux a partir de C ++ std::fstream .

Pensé en boost::iostream ya que hay una clase llamada file_descriptor pero entendí que su propósito es diferente al que quiero lograr.

¿Conoces alguna forma de hacer eso?

Puede ir por el otro camino: implemente su propio búfer de secuencia que envuelve un descriptor de archivo y luego fstream con iostream lugar de fstream . Usar Boost.Iostreams puede facilitar la tarea.

La solución gcc no portátil es:

 #include  { int fd = ...; __gnu_cxx::stdio_filebuf fd_file_buf{fd, std::ios_base::out | std::ios_base::binary}; std::ostream fd_stream{&fd_file_buf}; // Write into fd_stream. // ... // Flushes the stream and closes fd at scope exit. } 

No hay una forma (estándar) de extraer el número de archivo de un archivo std :: fstream, ya que la biblioteca estándar no ordena cómo se implementarán las secuencias de archivos.

Por el contrario, necesita utilizar la API de archivo C si desea hacer esto (utilizando FILE* ).

No existe una forma oficial de obtener el manejador de archivos privados de una secuencia de archivos (o de hecho std::basic_filebuf ), simplemente porque debería ser portátil y desaconsejar el uso de las funciones específicas de la plataforma.

Sin embargo, puede hacer hack feo como heredar std::basic_filebuf y, a partir de eso, intentar sacar el identificador del archivo. No es algo que recomiendo, ya que probablemente se rompa en diferentes versiones de la biblioteca C ++.

No se admite exponer el descriptor de archivo ni en C ++ estándar ni en libstdc++ .