C/C++中从文件末尾反向读取N行文件记录(末尾读取文件)
最近在实际的开发项目遇到了一个问题,有个24小时在跑的Linux程序,会不断有日志输出,写到一个指定的日志文件中。但是,日志只提供了输出的功能,并没有读取日志文件的功能。如果给程序员自己看日志是很简单的,只需要用tail 或 vi 即可。但是现在有个需求,需要在程序的界面上显示日志文件的内容,而且是最近的100行记录。在网上搜索了一遍,总结一下:
1:从文件头开始,先用getline函数获取每一行,然后再丢弃前面的数据。
我:不行,日志文件有可能几百MB,全部读一篇再丢弃是行不通的。
2:自己先计算文本有多少行,然后再截取。
我:没有找到具体的实现代码,而且我正在读取这个文件时有可能程序正在输出日志,不能随意破坏文件的输出。
最终没找到合适解决方案,我自己的思路是这样的:
1:打开文件
2:将文件指针移到最后。
3:反向搜索换行符,如果达到100行则停止搜索了。
4:根据当前位置再将一行行记录读取放到vector里。
5:现在可以将vector里的记录进行处理。
实现后发现反向读取100的内容还是很快的,0.1毫秒都不用,当然,这要看一行的内容有多少。
而且代码中并不真正去读取字符,只是用C++的io输入流中的peek函数查看数据,效率提高了。
代码如下:
---------------------
std::ifstream fin( "/var/log/test.log" , std::ios::ate );
if( !fin )
{cerr<<"打开日志文件失败!";return -1;
}// 先倒回文件末尾两个字符
fin.seekg(-2, fin.cur);
// 假定反向读取100行记录
int lineCount = 100;
for(int i = 0; i < lineCount; i++)
{ // 查看前一个字符是否为回车符while( fin.peek() != fin.widen('\n') ){fin.seekg(-1, fin.cur );}// 走到这里表示跳过一行了,所以继续跳直到够100行fin.seekg(-1, fin.cur);
}fin.seekg(2, fin.cur);
// 现在文件指针指向99行的末尾,可以读取了
vector<string> result;
std::string line;
while( getline(fin, line) )
{//cout <<"新入一行 : "; << line << endl;result.push_back( line );
}
fin.clear();
fin.close();
C/C++中从文件末尾反向读取N行文件记录(末尾读取文件)相关推荐
- java保存文件filedialog保存路径 文件名_Winform控件SaveFileDialog用于保存文件
SaveFileDialog用于保存文件,供大家参考,具体内容如下 1.新建Winform窗体应用程序,命名为SaveFileDialogDemo. 2.在界面上添加一个按钮的控件(用于打开保存文件对 ...
- Android在Activity中动态增加xml自定义样式布局控件(引用xml布局文件和循环增加控件)
工程目录: MainActivity package com.example.test1121;import androidx.appcompat.app.ActionBar; import andr ...
- linux 只删除空文件夹,Linux如何删除空文件夹-linux删除文件夹
请关注本头条号,每天坚持更新原创干货技术文章. 如需学习视频,请在微信搜索公众号"智传网优"直接开始自助视频学习. 1. rmdir命令简介 本文主要介绍rmdir命令,该命令用于 ...
- php 执行多个文件,PHP提高执行多个查询时读取一千行文件的性能
我试图建立一个脚本,我需要读取txt文件并使用文件上的行执行某个过程.例如,我需要检查ID是否存在,如果信息已更新(如果有),则更新当前表(如果不存在),则在另一个临时表上插入一个新行,稍后手动检查. ...
- GIT项目管理工具(part4)--提交文件暂存记录及同步文件至本地仓库
本系列BLOG为鄙人学习GIT时的学习笔记.前一个知识点引出后一个知识点,后一个例子接着前一个例子. 文章目录 基本操作 3.将工作内容记录到暂存区 4.取消文件暂存记录 5.将文件同步到本地仓库 举 ...
- 通达信软件服务器文件是那个,通达信“指标模块”存放在哪个文件夹里
匿名用户 1级 2016-12-13 回答 通达信目录文件结构及说明 vipdoc: 下载或缓存的历史数据目录 diary: 投资日志目录 RemoteSH: 缓存的上海 F10 RemoteSZ: ...
- python从文件中读取数据时出现错误_Python 从文件中读取数据
读取整个文件 # 案例:读取整个文件 # pi_digits.txt 3.1415926535 8979323846 2643383279 # file_reader.py with open ('p ...
- TF学习——TF数据读取:TensorFlow中数据读这三张图片的5个epoch +把读取的结果重新存到read 文件夹中
TF学习--TF数据读取:TensorFlow中数据读这三张图片的5个epoch +把读取的结果重新存到read 文件夹中 目录 实验展示 代码实现 实验展示 代码实现 1.如果设置shuffle为T ...
- ecplice中class.forname一直报错_Python怎么把文件内容读取出来,怎么把内容写入文件中
读写文件是最常见的IO操作.Python内置了读写文件的函数. Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 ...
最新文章
- 如何将自己写的verilog模块封装成IP核(二)
- NLP - Log-linear Models
- 【Android 安全】DEX 加密 ( DEX 加密使用到的相关工具 | dx 工具 | zipalign 对齐工具 | apksigner 签名工具 )
- Linux-使用 Find 命令找到那些需要清理的文件
- QGraphicsScene 的简单理解--关于手册的简要翻译
- 《程序员歌单》请查收
- linux下I2C驱动发送IO时序,I2C驱动情景分析——怎样控制I2C时序
- Golang实践录:xorm使用记录
- OpenCV-python学习笔记(二)——image processing图像基本处理
- linux压缩隐藏文件,Linux下查看压缩文件内容的10种方法(小结)
- [应用代码] android 自动接听电话和挂断 (适合目前所有版本)
- java 任务定时调度(定时器)
- 在VMware Workstation中创建一个虚拟软盘,并在Windows XP上使用
- 重磅!中国首家互联网银行联手腾讯、华为各大APP,最高5万额度,疯狂提额100亿!!!...
- 帝国站长php主动推送,帝国CMS 链接主动推送插件设置帮助
- access突然需要登录_登录信息提示
- 我裸辞全职接单第一个月的收入
- Apex Lightning Salesforce 学习笔记及报错问题(持续更新)
- 硬件学习 软件Cadence day07 PCB 底板电路图布线
- jquery字符串相等判断
热门文章
- 你的数据也可以-三篇NAR的数据库
- 嗐,别的95后一天两登Nature,你却还不知道有一款工具可以帮你校对英文文稿和回复审稿意见...
- vins中imu融合_视觉和imu融合的算法研究
- 1.3编程基础之算术表达式与顺序执行 05 计算分数的浮点数值
- settimeout需要清除吗_前端20个真正灵魂拷问,前端初级到中级你还需要这个!
- RTX5 | 内存池04 - 共享内存用于线程之间的通讯(阻塞方式)- 使用信号量
- linux ls命令shell脚本位置,linux - shell脚本到ls并在ls上执行命令结果 - SO中文参考 - www.soinside.com...
- 多重选定怎么撤销_多重网络问题怎么解决?如何取消多重网络?
- Java工作笔记-webService发布时通用的4个注解
- Qt笔记-获取Windows下目前运行的进程信息