Leider Blick durch den Standard nichts von basic_filebuf
oder einen des basic_[io]?fstream
Klassen-Templates zur Verfügung gestellt ist, damit Sie das zugrunde liegende Betriebssystem Dateideskriptor (in der Weise, dass fileno()
tut für C stdio I/O) zu extrahieren.
Es gibt auch keine open()
Methode oder Konstruktor, der einen solchen Dateideskriptor als Parameter verwendet (wodurch Sie die Datei mit einem anderen Mechanismus öffnen und das Dateihandle aufzeichnen könnten).
Es gibt basic_ostream::flush()
, aber ich vermute, dass dies in der Tat nicht Anruf fsync()
- Ich erwarte, dass, wie fflush()
in stdio, es nur dafür sorgt, dass die User-Space-Laufzeitbibliothek Puffer gespült werden, was bedeutet, dass das Betriebssystem konnte Puffer weiterhin die Daten.
Kurz gesagt scheint es keine Möglichkeit zu geben, dies portabel zu machen. ? :(
Was zu tun ist, Mein Vorschlag basic_filebuf<C, T>
Unterklasse:
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;
, es zu benutzen, können Sie ein ofstream
mit dem Standard-Konstruktor konstruieren, weist dann die neuen Puffer mit 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();
Natürlich könnten Sie auch eine neue Klasse von basic_ostream
ableiten, um den Prozess des Öffnens einer Datei und das Abrufen des Dateideskriptors bequemer zu machen.
Ok, was ist, wenn ich es zum Anhängen öffne? – Vik