查找文本文件中的关键字,说白了就是以文本文件作为输入,进行字符串匹配,找返回其第一次出现的下标位置。但是由于数据是以文本文件的形式作为输入的,如何存储和进行匹配就成为了一个问题。下面以两种方法来介绍如何操作。注:本文中采用的字符串匹配算法只是普通的字符串匹配算法,重点在对文件处理和分块查找。
一、蛮力法
这种方法非常简单,把文件中的所有数据输入到一个字符数组中,然后以数组作为主串,关键字为模式串,进行字符串匹配即可。
但是这里有一个问题,就是字符数组要多大才合适?由于不同的文件的数据量可能差别非常大,所以我们应该根据文件的大小来动态分配字符数组来存储主串。即我们现在的问题变为如何获得文件的大小。文件的大小可以用如下的方法来获得,首先打开文本文件,保存其文件位置,然后把文件指针定位到文件的末尾,获得其偏移量,然后再把文件指针恢复到原先即可。恢复文件指针是为了不让该调用对文件的其他操作产生影响,从外部看来这个操作调用前与调用后文件的状态并没有变化过。其现实代码如下,返回文件所占的字符总数:
int GetFileLength(ifstream &inputFile)
{
//保存文件当前位置
streampos pos = inputFile.tellg();
//定位到文件尾
inputFile.seekg(0, ios::end);
//返回文件尾的偏移量,即文件的大小
int length = inputFile.tellg();
//返回到文件先前的位置
inputFile.seekg(pos);
return length;
}
则实现字符串匹配的函数如下:
int IndexInFile(const char *fileName, const char *keyWord)
{
//以只读方式,打开文件fileName
ifstream inputFile(fileName);
if(!inputFile)
{
//打开文件失败
cerr<<"error: unable to open input file: "