Desafortunadamente, mirando a través de la norma no hay nada proporcionada por basic_filebuf
o cualquiera de las plantillas de clase basic_[io]?fstream
para permitir que se extraiga el descriptor de archivo del sistema operativo subyacente (en la forma en que lo hace fileno()
para C stdio E/S).
Ni hay un open()
método o constructor que tome un descriptor de archivo como un parámetro (que le permita abrir el archivo usando un mecanismo diferente y grabar el identificador de archivo).
Hay basic_ostream::flush()
, sin embargo sospecho que esto no es así, de hecho, llamada fsync()
- espero que, como fflush()
en stdio, sólo se asegura de que los amortiguadores de la biblioteca de espacio de usuario en tiempo de ejecución se vacían, lo que significa que el sistema operativo podría aún estar almacenando los datos.
En pocas palabras, parece que no hay forma de hacerlo de forma portátil. ? :(
Qué hacer Mi sugerencia es subclase basic_filebuf<C, T>
:
template <typename charT, typename traits = std::char_traits<charT> >
class my_basic_filebuf : public basic_filebuf<charT, traits> {
....
public:
int fileno() { ... }
....
};
typedef my_basic_filebuf<char> my_filebuf;
Para usarlo, se puede construir un ofstream
utilizando el constructor por defecto, a continuación, asignar el nuevo buffer con rdbuf()
:
my_filebuf buf;
buf.open("somefile.txt");
ofstream ofs;
ofs.rdbuf(&buf);
ofs << "Writing to somefile.txt..." << endl;
int fd = static_cast<my_filebuf*>(ofs.rdbuf())->fileno();
Por supuesto, también puede obtener una nueva clase de basic_ostream
para hacer más conveniente el proceso de abrir un archivo y recuperar su descriptor de archivo.
Ok, ¿qué ocurre si lo abro para anexarlo? – Vik