[转]在文件中查找字符串——一个可重用代码段
因为做“给予电子邮箱的网络硬盘”要用到这么个东西,所以自己写了一个,也许算法不是很好,效率不是很高,但用于做那个网络硬盘的软件是足够了。
我一共写了两个这样功能的函数,一个是静态成员函数,另一个是非静态成员函数,他们都是类CEMailFile类的成员,这个类是用于分析下载到本地的电子邮件并可以将编过码附件提取出来。
以下是类的静态成员函数:
int CEMailFile::FindInFile(LPCTSTR sFilePath, LPCTSTR sString)
{
CFile file;
if(!file.Open(sFilePath,CFile::modeRead)) return -1;
UINT nStrLen=strlen(sString);
CFileStatus FileStatus;
if(!file.GetStatus(FileStatus)) return -1;
file.SeekToBegin();
CString strBuff;
int nRes=-1;
strBuff.GetBufferSetLength(1024);
for(long i=0;i<FileStatus.m_size;)
{
memset(strBuff.GetBuffer(0),'\0',1024);
file.Seek(i,CFile::begin);
file.Read(strBuff.GetBuffer(0),1024);
nRes=strBuff.Find(sString);
if(nRes>=0)
{
file.Close();
return i+nRes;
}
else
{
i=(i+1024)-nStrLen;
}
}
file.Close();
return nRes;
}
///////////////////////////////////////////////////////////////////////////////
说明:
返回值:该函数的返回值是int型,如果查找成功,即找到了要查找的字符串(区分大小写),那就返回字符串首字符在文件中的位置(从0计算);如果查找不成功则返回一个负数;如果查找中遇到了其他的错误,如文件打开失败,文件状态异常等,也将返回负数(此时为-1)。
参数:有两个参数,第一个参数sFilePath指示目标文件的路径(相对或绝对),第二个参数用于指示目标字符串(字符数组要以'\0'结尾),即要查找的字符串,二者都不应为空,否则会产生错误。