2012-07-19 14 views
11

Duplicar posibles:
Getting a FILE* from a std::fstreamdescriptor de archivo de un std :: fstream

estoy trabajando en Linux y descriptores de fichero son el modelo principal de este sistema operativo.

Me preguntaba si hay alguna biblioteca o alguna forma de recuperar el descriptor de archivo nativo de Linux a partir de un 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 hacerlo?

+1

¿Por qué necesita el descriptor de archivo? –

+0

También busco NON-Standard ya que me apegaré a la plataforma Linux. Encontré esta página también. ¿Alguien lo usó? Anyhttp: //www.ginac.de/~kreckel/fileno/ –

+6

Esta pregunta no es un duplicado. Esta pregunta pregunta cómo obtener un descriptor de archivo de un iostream. Un descriptor de archivo es un concepto de kernel de bajo nivel. La pregunta señalada como el original del cual supuestamente es un duplicado habla de flujos FILE *, que no son lo mismo. – Daniel

Respuesta

5

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

solución gcc no es portátil:

#include <ext/stdio_filebuf.h> 

{ 
    int fd = ...; 
    __gnu_cxx::stdio_filebuf<char> 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. 
} 
2

No se admite la exposición del descriptor de archivo ni en C++ estándar ni en libstdc++.

3

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

Más bien, necesita usar la API de archivo C si desea hacer esto (usando FILE*).

3

No hay forma oficial de obtener el manejador de archivo privado de una secuencia de archivos (o realmente un std::basic_filebuf), simplemente porque debería ser portátil y desaconsejar el uso de funciones específicas de la plataforma.

Sin embargo, puede hacer hack feo como heredar std::basic_filebuf y 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++.

Cuestiones relacionadas