2013-07-24 7 views
0

Я пытаюсь получить html-файл, который является одним из файлов, расположенных внутри файла tar, и у меня есть что-то в виду, я не знаю его правильного или не ?? пожалуйста, укажите мне, если я ошибаюсь. Моя идея:пытается получить содержимое html-файла, находящегося внутри файла tar

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

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

это-
 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? Даже размер объявления i меньше, чем размер tar-файла, если я вижу вручную?

ответ

0

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

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