为什么它会进入无限循环?

时间:2012-03-30 12:29:03

标签: c++ file

我有一个类,它接受一个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";
}

}

但是如果我将这个函数用于小文件它可以使用fyn,但对于像google主页源这样的大型html文件,它会进入无限循环。

以下是调用堆栈。

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,unsigned 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 个答案:

答案 0 :(得分:2)

这一行:

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的全部。你现在处于无限循环中。