我有一个类,它接受一个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;
}
任何人都知道可能是什么原因,为什么它总是发生在大型无格式文件中。
答案 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的全部。你现在处于无限循环中。