Ответ 1
К сожалению, при просмотре стандарта нет basic_filebuf
или любого из шаблонов классов basic_[io]?fstream
, чтобы вы могли извлечь базовый дескриптор файла ОС (таким образом, что fileno()
делает для C stdio I/О).
Здесь нет метода или конструктора open()
, который принимает такой дескриптор файла как параметр (который позволит вам открыть файл с использованием другого механизма и записать дескриптор файла).
Существует basic_ostream::flush()
, однако я подозреваю, что это фактически не вызов fsync()
- я ожидаю, что, как и fflush()
в stdio, он только очищает буферы библиотеки времени выполнения пользовательского пространства, это означает, что ОС все еще может буферизировать данные.
Короче говоря, похоже, что это невозможно.: (
Что делать? Мое предложение заключается в подклассе 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;
Чтобы использовать его, вы можете построить ofstream
с помощью конструктора по умолчанию, а затем назначить новый буфер 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();
Конечно, вы также можете получить новый класс из basic_ostream
, чтобы упростить процесс открытия файла и получить его файловый дескриптор.