Windows — чтение из очень большого ресурса текстового файла в переполнении стека

У нас есть некоторые данные в текстовом файле, который встроен в наш исполняемый файл как пользовательский ресурс для чтения во время выполнения. Размер этого текстового файла составляет более 7 миллионов символов.

Я могу успешно искать и находить строки в ресурсе, которые появляются в верхней части текстового файла, но при попытке поиска терминов на несколько миллионов символов strstr возвращает NULL, указывая, что строка не может быть найдена. Существует ли ограничение на длину строкового литерала, который может храниться в символе *, или на объем данных, который может храниться во встроенном ресурсе? Код показан ниже

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

Решение

Проблема может быть в методе, который вы используете для поиска. strstr использует строки ANSI и прекратит работу, когда обнаружит «\ 0» в домене поиска.

Вы можете использовать что-то вроде memstr (одна из многих реализаций может быть найдена Вот).

2

Другие решения

Получаете ли вы какой-либо вывод из GetLastError (), особенно после вызова SizeofResource,

Вы также можете проверить, что dataSize > 0 чтобы убедиться, что ошибка не произошла.

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

Документы MSDN

1

Проблема была в нулевых символах в данных, которые преждевременно заканчивали переменную char *. Чтобы обойти это, мне просто нужно было прочитать данные в пустой указатель, а затем скопировать их в динамически создаваемый массив.

DWORD dataSize = SizeofResource(hInst, hRes);
void* pvData = LockResource(hData);
char* pcData = new char[dataSize];
memcpy_s(pcData,strlen(pcData),pvData,dataSize);
1
По вопросам рекламы [email protected]