这应该很常见,但我发现我找不到任何直接的解决方案很有趣。
基本上,我通过网络将文件读入字符串流。这是声明:
std::stringstream membuf(std::ios::in | std::ios::out | std::ios::binary);
现在我有一些 C 库想要直接访问内存的读取 block 。我怎么得到它?只读访问是好的。 C函数完成后,我将内存流处理掉,不需要它。
str()
复制缓冲区,这似乎是不必要的,并且使内存加倍。
我是否遗漏了一些明显的东西?也许不同的 STL 类会更好。
编辑: 显然,不保证 stringstream 可以连续存储。是什么?
如果我使用 vector<char>
如何获取字节缓冲区?
最佳答案
您可以通过自己编写缓冲区并在 stringstream
中使用该缓冲区来完全控制所使用的缓冲区。
stringstream membuf(std::ios::in | std::ios::out | std::ios::binary);
membuf.rdbuf(yourVeryOwnStreamBuf);
您自己的缓冲区应该来自 basic_streambuf
, 并覆盖 sync()
和 overflow()
适当的方法。
对于您的内部表示,您可能可以使用 vector< char >
之类的东西。 , 和 reserve()
将其调整到所需的大小,这样就不会进行重新分配和复制。
这意味着您事先知道所需空间的上限。但是如果事先不知道大小,最后还需要一个连续的缓冲区,那么拷贝当然是不可避免的。
关于C++ STL 字符串流直接缓冲区访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1877500/