不幸的是,查看标准没有提供basic_filebuf或任何basic_ [io]?fstream类模板,以允许您提取底层的操作系统文件描述符(以fileno()为C stdio I / O的方式) .
也没有一个open()方法或构造函数将这样的文件描述符作为参数(这将允许您使用不同的机制打开文件并记录文件句柄).
有basic_ostream :: flush(),但是我怀疑这实际上并不调用fsync() – 我期望像stdio中的fflush(),它只确保用户空间运行时库缓冲区被刷新,这意味着操作系统仍然可以缓冲数据.
所以总之,似乎没办法这样做. 🙁
该怎么办?我的建议是将basic_filebuf< C,T>:
template >
class my_basic_filebuf : public basic_filebuf {
....
public:
int fileno() { ... }
....
};
typedef my_basic_filebuf my_filebuf;
要使用它,您可以使用默认构造函数构造一个stream,然后使用rdbuf()分配新的缓冲区:
my_filebuf buf;
buf.open("somefile.txt");
ofstream ofs;
ofs.rdbuf(&buf);
ofs << "Writing to somefile.txt..." << endl;
int fd = static_cast(ofs.rdbuf())->fileno();
当然,你也可以从basic_ostream派生一个新的类,使得打开文件的过程和检索其文件描述符更方便.