gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-31 01:33:11 25 4
gpt4 key购买 nike

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

看起来没有标准的方法可以做到这一点。

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

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

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

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

如果我导出一个函数,在内部使用 C++ 流工具,使用这个原型(prototype)

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;
}

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

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

最佳答案

存在一个(非标准,现在正在寻找引用)C++ streambuf,它是 stdio 之上的一层,那么不断刷新流缓冲区就足够了。

自动刷新部分使用 std::unitbuf 可移植地完成:

mysb << std::unitbuf;

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

关于c++ - 如何从 C FILE* 创建 C++ streambuf 对象,与指向的 FILE 对象共享其缓冲区(和缓冲区状态)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41859487/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com