我已经在Windows XP和Visual Studio中使用c ++语言编写了一个应用程序。
在该应用程序中,我使用LoadResource()API加载资源,以便在资源内存中提供文件。
它返回了一个内存块指针,我想将指针转换为std流以用于兼容性。
有人能帮帮我吗?
答案 0 :(得分:2)
您无法将资源投射到流类型。要么复制字节:
std::stringstream ss;
ss.rdbuf().sputn(buf, len);
或者您将资源包装在自己的streambuf中:
class resourcebuf : public std::streambuf {
// Todo: implement members including at least xsgetn, uflow and underflow
};
并将其传递给istream::istream
答案 1 :(得分:1)
你为什么需要这个?
将原始数据指针转换为流意味着对资源进行逐字节复制,因此缺乏性能(另外,我认为这种方法没有任何好处)。
如果您想使用原始内存,请使用它。在这里投射(兼容性?)似乎是一种非常奇怪的方法。
但是,如果你想这样做,你可以从内存块创建一些流,将其视为一个字节序列。在这种情况下,这意味着使用std::stringstream
(istringstream
)。
按LockResource
锁定资源后,从收到的void*
指针创建一个字符串,并将其传递给stringstream
实例。
void* memory = LockResource(...);
// You would probably want to use SizeofResource() here
size_t memory_size = ... ;
std::string casted_memory(static_cast<char*>(memory), memory_size);
std::istringstream stream(casted_memory);
答案 2 :(得分:0)
最简单的方法可能是将缓冲区转换为string
,然后转换为stringstream
:
std::stringstream ss(std::string(buf,len));
我认为这会复制两次,所以如果结果需要花费很多时间,你可能需要寻找替代方案。您可以使用strstream
,但它可能会使广场变得怪异。