почему это происходит в бесконечном цикле? - PullRequest
1 голос
/ 30 марта 2012

У меня есть класс, который берет HTML-файл и форматирует его. Вот мой код.

void FormatHtml::Format(const std::string &formattedFile, const std::string &inputFile) const
{
    string str;
    ifstream inputfileObj(inputFile.c_str());
    //ofstream formattedFileObj(formattedFile.c_str());

    if(inputfileObj.is_open() /*&& formattedFileObj.is_open()*/)
    {
        while(inputfileObj.good())
        {
            getline(inputfileObj,str);
            //cout<<str<<endl;
            //formattedFileObj<<str;
            int pos = str.find(">");
            int pos3;
            while(pos != string::npos)
            {
                pos3 = str.find("<",pos);
                if(str.length() >= pos3+1) 
                {
                    if(str.at(pos3+1) == '/')
                    {
                        pos = str.find(">",pos3);
                    }
                }
                cout<<str.substr(0,pos+1)<<endl;
                //formattedFileObj<<str.substr(0,pos+1)<<endl;

                str = str.substr(pos+1,string::npos);
                pos = str.find(">");
            }
        }

        inputfileObj.close();
        //formattedFileObj.close();
    }
    else
        cout<<"could not open file";
}

}

но если я использую эту функцию с небольшим файлом, она работает фин, но для более крупного html-файла, такого как исходный код главной страницы Google, она идет в бесконечный цикл.

следующий - стек вызовов.

ntdll.dll!76f99a94()    
[Frames below may be incorrect and/or missing, no symbols loaded for ntdll.dll] 
ntdll.dll!76f98d94()    
ntdll.dll!76fa9522()    
kernel32.dll!7588cb6c()     
kernel32.dll!7588cbfc()     
kernel32.dll!7588c964()     

msvcr90d.dll! _Write_nolock (int fh = 14548992, const void * buf = 0x77004cc0, без знака int cnt = 4074376) Строка 335 + 0x3c байт C ffffffff ()

И когда я приостанавливаю выполнение, оно всегда останавливается в одном файле с именем write.c и в следующем коде:

                /* write the lf buf and update total */
                if ( WriteFile( (HANDLE)_osfhnd(fh),
                            lfbuf,
                            (int)(q - lfbuf),
                            (LPDWORD)&written,
                            NULL) )
                {
                    charcount += written;
                    if (written < q - lfbuf)
                        break;
                }

Любой, кто знает, что может быть причиной, почему это всегда происходит с большим неформатированным файлом.

1 Ответ

2 голосов
/ 30 марта 2012

Эта строка:

pos = str.find(">",pos3);

Если pos == string :: npos, то вы продолжаете делать это:

str = str.substr(pos+1,string::npos);
pos = str.find(">");

string :: npos == -1,поэтому pos + 1 == 0, поэтому str.substr возвращает все str.Вы находитесь в бесконечном цикле.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...