如何从 C FILE* 创建 C++ streambuf 对象,与指向的 FILE 对象共享其缓冲区(和缓冲区状态)?

How to create a C++ streambuf object from a C FILE*, sharing its buffer (and buffer state) with the FILE object pointed to?

如何从 C FILE* 获取 C++ streambuf 对象,以便它使用 FILE 对象的缓冲区,避免两个对象管理单独的缓冲区,同时指向相同的底层文件。

似乎没有标准的方法来做到这一点。

Boost 有一个 stream_buffer class,它有一个采用文件描述符的构造函数,允许在用 C 代码打开的文件上使用 C++ 功能。例如:

boost::iostreams::stream_buffer<boost::iostreams::file_descriptor_sink> mysb (fileno(myFileptr), boost::iostreams::never_close_handle));

myFileptr 属于 FILE* 类型。问题是 mysbmyFileptr 指向的 FILE 对象将维护单独的缓冲区,所以这不是一个选项......

这是我的问题的背景。我必须提供一个带有 C 接口的动态可链接库(所有导出的变量、函数参数和函数 return 值必须具有 C 类型),但该库实际上是用 C++ 开发的。

如果我使用此原型在内部使用 C++ 流工具导出函数

Void MyExportedFunct( FILE* myfile)

并且,我在 C 程序中导入库:

int main()
{
    FILE * fptr = fopen(“SomeFile”, "w");
    fprintf(fptr, “Some data.”)
    MyExportedFunct(fptr);
    fprintf(fptr, “Some more data…”)
    return 0; 
} 

我希望数据以正确的顺序写入实际发送的文件(避免交错字符)。

欢迎就如何实现此目标或其他方法提出任何建议。

存在一个(non-standard,现在正在寻找参考)C++ streambuf,它是stdio之上的一层,那么不断刷新流缓冲区就足够了。

automatic-flush 部分可移植地使用 std::unitbuf:

完成
mysb << std::unitbuf;

啊,它被命名为 stdio_filebuf 并且带有 gcc 的 C++ 库:__gnu_cxx::stdio_filebuf::stdio_filebuf constructor