这应该是相当普遍的但我发现我找不到任何直接的解决方案令人着迷.
基本上我通过网络将文件读入字符串流.这是声明:
std::stringstream membuf(std::ios::in | std::ios::out | std::ios::binary);
Run Code Online (Sandbox Code Playgroud)
现在我有一些C库需要直接访问内存的读取块.我怎么做到的?只读访问权限就可以了.C函数完成后,我处理了内存流,不需要它.
str() 复制缓冲区,这似乎是不必要的,并使内存翻倍.
我错过了一些明显的东西吗 也许一个不同的stl类可以更好地工作.
编辑:显然,不保证stringstream连续存储.什么是?
如果我使用vector<char>如何获得字节缓冲区?
我有一个网络客户端,其请求方法需要一个std::streambuf*.这个方法是通过将boost::iostreams::copy它发送到一个自定义std::streambuf类来实现的,该类知道如何将数据写入网络API,这很有效.这意味着我可以将文件流式传输到请求中,而无需将其全部读入内存.
但是,在某些情况下,必须发送不在文件中的大块数据,因此我包含了一个带字符串的重载.为了避免重复流中的所有网络代码,我应该设置一个streambuf代表字符串并调用另一个方法.我能弄清楚这项工作的唯一方法是:
std::istringstream ss(data);
send(ss.rdbuf());
Run Code Online (Sandbox Code Playgroud)
不幸的是,istringstream制作数据的副本,在某些情况下是几兆字节.当然,在一般情况下,它非常有意义,如果你将const引用交给某个对象,你不希望该对象假设它可以继续使用该引用.
我用以下方法解决了这个问题:
struct zerocopy_istringbuf
: public std::stringbuf
{
zerocopy_istringbuf(std::string const* s)
: std::stringbuf(std::ios::in)
{
char* p = const_cast<char*>(s->c_str());
setg(p, p, p + s->length());
}
};
...
send(&zerocopy_istringbuf(data));
Run Code Online (Sandbox Code Playgroud)
这似乎工作得很好,但我想知道它是否真的有必要.为什么没有std::istringstream过载std::string const *?有一个更好的方法吗?