从C ++中的非常大的文本文件资源中读取

时间:2013-10-18 10:01:37

标签: c++ windows embedded-resource

我们在文本文件中有一些数据,它作为要在运行时读取的自定义资源构建到我们的可执行文件中。此文本文件的大小超过700万个字符。

我可以成功搜索并找到资源中出现在文本文件顶部附近的字符串,但在尝试搜索几百万个字符的字符时,strstr返回NULL,表示找不到该字符串。可以存储在char *中的字符串文字的长度是否有限制,或者可以存储在嵌入式资源中的数据量是否有限制?代码如下所示

char* data = NULL;
HINSTANCE hInst = NULL;
HRSRC hRes = FindResource(hInst, MAKEINTRESOURCE(IDR_TEXT_FILE1), "TESTRESOURCE");
if(NULL != hRes)
{
    HGLOBAL hData = LoadResource(hInst, hRes);
    if (hData)
    {
        DWORD dataSize = SizeofResource(hInst, hRes);
        data = (char*)LockResource(hData);
    }
    else
        break;

    char* pkcSearchResult = strstr(data, "NumListDetails");
    if ( pkcSearchResult != NULL )
    {
        // parse data
    }
}

感谢。

3 个答案:

答案 0 :(得分:2)

问题可能是您用于搜索的方法。 strstr使用ANSI字符串,并在搜索域中遇到'\ 0'时终止。

您可以使用类似memstr的内容(可以找到许多实现中的一个here)。

答案 1 :(得分:1)

您是否从GetLastError()获得任何输出,特别是在调用SizeofResource之后。

您还可以检查dataSize > 0以确保没有发生错误。

DWORD dataSize = SizeofResource(hInst, hRes);
if(dataSize > 0)
{
    data = (char*)LockResource(hData);
}
else 
{
    //check error codes
}

MSDN Docs

答案 2 :(得分:1)

问题是数据中的空字符过早结束了char *变量。为了解决这个问题,我只需将数据读入void指针,然后将其复制到动态创建的数组中。

DWORD dataSize = SizeofResource(hInst, hRes);
void* pvData = LockResource(hData);
char* pcData = new char[dataSize];
memcpy_s(pcData,strlen(pcData),pvData,dataSize);