您的位置:首页 > 其它

高效地反向逐行读取文件

2015-10-10 09:23 351 查看
      
在某些时候,我们需要从文本中读取最后几行。这时候如果采用基于流的文件读取方式,在文件大的时候效率十分低下,因为要把整个文本读取一遍才能定位到最后几行。本文提供的实现采用逐块回退读取文件数据的方式,提供快速且内存可控的反向逐行读取功能。上代码吧:

class BackwardLineReader

{

public:

    //
指定文件路径、换行符、每次读取的字节数、最大的缓存大小(用于避免由于一直没有读到换行,导致内存无限增大)

   
BackwardLineReader(const std::string& filePath, const
std::string& endOfLine_, int singleReadFileBytes_ = 4096, int
maxBufSize_ = 4096)

   
    :
fp(NULL)

   
    ,
endOfLine(endOfLine_)

   
    ,
fileSize(0)

   
    ,
currentReadFilePos(0)

   
    ,
singleReadFileBytes(singleReadFileBytes_)

   
    ,
maxBufSize(maxBufSize_)

   
    ,
failedFlag(false)   
{

   
   
XASSERT(endOfLine.size() > 0 && singleReadFileBytes >
0 && maxBufSize > 0);

   
    fileSize =
FileUtil::getFileSize(filePath);  // 获取文件的大小

   
    if (fileSize
<= 0) {

   
   
    failedFlag =
true;

   
   
   
return;

   
    }

   
   
currentReadFilePos = fileSize;

   
    fp =
fopen(filePath.c_str(), "rb");

   
    if (fp)
{

   
   
    if
(fseek(fp, 0, SEEK_END) != 0) { // 将文件指针指向文件的最后

   
   
   
    failedFlag =
true;

   
   
    }

   
    } else
{

   
   
    failedFlag =
true;

   
    }

   
}   

   
~BackwardLineReader() {

   
    if (fp)
{

   
   
   
fclose(fp);

   
    }

    }

    bool
readLine(std::string& result) {

   
    if
(failedFlag) {

   
   
    return
false;

   
    }

   
    do {

   
   
    int pos =
findLastEndOfLinePos();   
// 在缓存中查找最后一个换行符

   
   
    if (pos
>= 0) { 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: