将从嵌入式资源文件创建的 ifstream 传递给 boost XML 解析器
Passing ifstream created from embedded resource file to boost XML parser
我正在尝试解析嵌入式资源 XML 文件:
HRSRC hresinfo = FindResource(hInstance, MAKEINTRESOURCE(IDR_XML1), _T("XML"));
if (hresinfo)
{
HGLOBAL hRes = LoadResource(hInstance, hresinfo);
DWORD datasize = SizeofResource(hInstance, hresinfo); // this size is correct
LPVOID data = LockResource(hRes);
if (hRes && datasize != 0 && data) {
ifstream in;
in.rdbuf()->pubsetbuf((char*)data, datasize);
streamsize size = in.rdbuf()->in_avail();
printf("size=%d", size); // this size is 0
pt::read_xml(in, tree); // parses nothing
}
else {
printf("error: %d\n", GetLastError());
}
}
memcpy 将数据放入常规缓冲区并打印每个字符,这让我相信问题出在 ifstream 上。
我认为 pubsetbuf 没有满足您的需求(但是,我并不完全理解它到底做了什么)。要设置从真实文件加载的 std::ifstream
内容,您可以执行以下操作:
std::ifstream in;
std::stringstream ss{std::string((char*)data, datasize)};
in.basic_ios<char>::rdbuf(ss.rdbuf());
std::string str;
in >> str; // to check if ifstream has expected content
std::cout << "str = " << str << std::endl;
您的 ifstream
将共享与 stringstream
从 data
指向的原始内存块创建的内容相同的内容。
编辑
抱歉,忘了 std::ifstream
。我看到pt::read_xml
接受std::basic_istream
,直接传std::stringstream
就可以了
我正在尝试解析嵌入式资源 XML 文件:
HRSRC hresinfo = FindResource(hInstance, MAKEINTRESOURCE(IDR_XML1), _T("XML"));
if (hresinfo)
{
HGLOBAL hRes = LoadResource(hInstance, hresinfo);
DWORD datasize = SizeofResource(hInstance, hresinfo); // this size is correct
LPVOID data = LockResource(hRes);
if (hRes && datasize != 0 && data) {
ifstream in;
in.rdbuf()->pubsetbuf((char*)data, datasize);
streamsize size = in.rdbuf()->in_avail();
printf("size=%d", size); // this size is 0
pt::read_xml(in, tree); // parses nothing
}
else {
printf("error: %d\n", GetLastError());
}
}
memcpy 将数据放入常规缓冲区并打印每个字符,这让我相信问题出在 ifstream 上。
我认为 pubsetbuf 没有满足您的需求(但是,我并不完全理解它到底做了什么)。要设置从真实文件加载的 std::ifstream
内容,您可以执行以下操作:
std::ifstream in;
std::stringstream ss{std::string((char*)data, datasize)};
in.basic_ios<char>::rdbuf(ss.rdbuf());
std::string str;
in >> str; // to check if ifstream has expected content
std::cout << "str = " << str << std::endl;
您的 ifstream
将共享与 stringstream
从 data
指向的原始内存块创建的内容相同的内容。
编辑
抱歉,忘了 std::ifstream
。我看到pt::read_xml
接受std::basic_istream
,直接传std::stringstream
就可以了