пытаясь получить содержимое HTML-файла, который находится внутри файла tar

я пытаюсь получить HTML-файл, который является одним из файлов, расположенных внутри tar-файла, и у меня есть кое-что, я не знаю, правильно ли это или нет ?? Пожалуйста, укажите мне, если я не прав. Моя идея

я создаю поток из tar-файла и сохраняю его в буфере, чтобы получить его содержимое, затем с помощью команды strstr для поиска html-файла внутри tar-файла (поскольку я знаю, что в моем tar-файле html-содержимое начинается с «< ! doctype html «и заканчивается на <«/ Html>» , так что я буду загружать содержимое между ними, которое на самом деле является HTML-файл). Мой подход правильно ??

Проблема в том, что когда я даю очень большой размер буферу (но меньший, чем размер tar-файла, который также содержит html + много других файлов), он дает стек по потоку при отладке. но когда я даю небольшой индекс, он показывает содержимое какого-то другого файла, который находится в начале, если я открываю tar-файл в блокноте (я проверил, открыв tar-файл в блокноте, это содержимое действительно присутствует в tar-файле, но в начале из tar-файла, поэтому, когда я увеличил индекс буфера, чтобы получить доступ к html-файлу, который расположен в середине файла (который на самом деле требует очень большой индекс), он дает стек-поток при отладке).
Мой код

     HRESULT AMEPreviewHandler:: CreateHtmlPreview(IStream *m_pStream) //this function is called from
// somewhere
ULONG  CbRead;
const int Size= 115000 ;
char Buffer[Size+1];
(m_pStream)->Read(Buffer, Size, &CbRead );
Buffer[CbRead ] = L'\0';
char *compare= "<!doctype html"; //this we have to search in tar file
// content because the html file contents starts from here
char * StartPosition;
StartPosition = strstr (Buffer,compare); //StartPosition  gives Bad
// pointer when Size is small on debugging at this small size i can see some contents in buffer which i
//can find in tar file at starting
__int64 count=0;
while (StartPosition!=NULL)
{
MessageBox(m_hwndPreview,L"hurr inside the while loop",L"BTN WND",MB_ICONINFORMATION);

count=StartPosition-Buffer+1; //to get the location of
//"<!doctype html";

}MessageBox(m_hwndPreview,L"wafter the while loop in CreateHtmlPreview  ",L"BTN WND",MB_ICONINFORMATION);
return true;
}

Скажите, пожалуйста, мой подход, чтобы получить содержимое файла html внутри файла tar правильно ?? и почему это дает переполнение стека, когда я даю большой индекс буферу для доступа к содержимому буфера, которое расположено в середине файла tar? даже размер, который я объявляю, меньше размера файла tar, если я вижу вручную?

0

Решение

Размер стека ограничен, поэтому простое распределение произвольных больших сумм не сработает — вам нужно либо установить для него ограничение, которое вписывается в доступный стек, а затем выполнить цикл для чтения (для забавы, если ваша «игольная нить» ( то, что вы ищете) перекрывает «разрыв» между двумя блоками, но это возможно преодолеть (см. ниже). Или просто не используйте стек, а используйте new выделить достаточно памяти для хранения всего файла. Конечно, если файл ОЧЕНЬ большой, это не сработает — файлы могут быть больше, чем общая память вашего компьютера, и тогда вы забиты, и вам придется вернуться к «читать немного за раз». С точки зрения ресурсов также бесполезно считывать весь файл в память, а выбрасывать большую его часть.

Одним из решений с использованием одного буфера будет добавление длины «иглы» к размеру буфера. Когда вы читаете второй раз, скопируйте длину байтов иглы из задней части буфера в начало, а затем прочитайте в буфер с байтами «иглы», затем выполните поиск с начала буфера. Пока буфер достаточно велик по сравнению с «иглой», накладные расходы при поиске в одной и той же части буфера дважды не будут иметь значения.

0

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

Других решений пока нет …

По вопросам рекламы [email protected]