2013-10-18 59 views
3

我们在文本文件中包含一些数据,该文件作为要在运行时读取的自定义资源构建到我们的可执行文件中。这个文本文件的大小超过700万个字符。从C++中非常大的文本文件资源中读取

我可以成功地搜索和查找出现在文本文件顶部附近的资源中的字符串,但是当试图搜索几百万个字符的字词时,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 
    } 
} 

谢谢。

+1

我猜这是在一个循环,否则'break'不会做任何事情。 –

回答

1

您是否从GetLastError()获得任何输出,具体是在调用SizeofResource之后。您可以检查dataSize > 0以确保没有发生错误。

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

MSDN Docs

+0

dataSize是700万,而'data'包含一个有效的字符串,我可以用strstr搜索。我会看看GetLastError返回并回复给你。 –

+0

啊哈。 strlen(data)返回3014.好在SizeOfResource返回的实际长度下。 –

+1

只要读到这一点,你有没有试过这个:http://msdn.microsoft.com/en-us/library/windows/desktop/ms647486.aspx - 使用LoadString而不是铸造为char *?我对这个过程并不熟悉,所以如果没有这个标记,就不要理会。干杯。 –

2

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

您可能会使用类似memstr之类的东西(可以找到here的许多实现之一)。

1

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

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