2013-10-18 195 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);