高效地反向逐行读取文件
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) {
相关文章推荐
- Java和C/C++进行DES/AES密文传输
- 使用std::map和std::list实现LRU(…
- live555 ubuntu 12.04 下的编译安装测试
- 对软件架构的一些思考(V2.0)
- QT程序如何获知鼠标enter/leave通…
- 谈谈网络编程中应用层(基于TCP/UDP…
- iOS 9 下周就正式推出了,你的 app 真的适配好了吗?
- VC 获取当前目录
- POJ 2823 单调队列入门水题
- 关于微软公有云Azure会计标准
- char str[] 与 char *str的区别详细解析
- 基于Boost线程库实现Java中atomic…
- 两种定制行为的方式:使用参数和使…
- C++没有所谓的"赋值构造函数"
- C++中用字符串来切割字符串
- LINQ统一数据操作语句
- 建议编程时不要注释无用代码
- 组合未必优于继承
- 初中时影响我人生观的一件事
- 对客户端/服务端开发的随想