最近在实际的开发项目遇到了一个问题,有个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行文件记录(末尾读取文件)相关推荐

  1. java保存文件filedialog保存路径 文件名_Winform控件SaveFileDialog用于保存文件

    SaveFileDialog用于保存文件,供大家参考,具体内容如下 1.新建Winform窗体应用程序,命名为SaveFileDialogDemo. 2.在界面上添加一个按钮的控件(用于打开保存文件对 ...

  2. Android在Activity中动态增加xml自定义样式布局控件(引用xml布局文件和循环增加控件)

    工程目录: MainActivity package com.example.test1121;import androidx.appcompat.app.ActionBar; import andr ...

  3. linux 只删除空文件夹,Linux如何删除空文件夹-linux删除文件夹

    请关注本头条号,每天坚持更新原创干货技术文章. 如需学习视频,请在微信搜索公众号"智传网优"直接开始自助视频学习. 1. rmdir命令简介 本文主要介绍rmdir命令,该命令用于 ...

  4. php 执行多个文件,PHP提高执行多个查询时读取一千行文件的性能

    我试图建立一个脚本,我需要读取txt文件并使用文件上的行执行某个过程.例如,我需要检查ID是否存在,如果信息已更新(如果有),则更新当前表(如果不存在),则在另一个临时表上插入一个新行,稍后手动检查. ...

  5. GIT项目管理工具(part4)--提交文件暂存记录及同步文件至本地仓库

    本系列BLOG为鄙人学习GIT时的学习笔记.前一个知识点引出后一个知识点,后一个例子接着前一个例子. 文章目录 基本操作 3.将工作内容记录到暂存区 4.取消文件暂存记录 5.将文件同步到本地仓库 举 ...

  6. 通达信软件服务器文件是那个,通达信“指标模块”存放在哪个文件夹里

    匿名用户 1级 2016-12-13 回答 通达信目录文件结构及说明 vipdoc: 下载或缓存的历史数据目录 diary: 投资日志目录 RemoteSH: 缓存的上海 F10 RemoteSZ: ...

  7. python从文件中读取数据时出现错误_Python 从文件中读取数据

    读取整个文件 # 案例:读取整个文件 # pi_digits.txt 3.1415926535 8979323846 2643383279 # file_reader.py with open ('p ...

  8. TF学习——TF数据读取:TensorFlow中数据读这三张图片的5个epoch +把读取的结果重新存到read 文件夹中

    TF学习--TF数据读取:TensorFlow中数据读这三张图片的5个epoch +把读取的结果重新存到read 文件夹中 目录 实验展示 代码实现 实验展示 代码实现 1.如果设置shuffle为T ...

  9. ecplice中class.forname一直报错_Python怎么把文件内容读取出来,怎么把内容写入文件中

    读写文件是最常见的IO操作.Python内置了读写文件的函数. Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 ...

最新文章

  1. 如何将自己写的verilog模块封装成IP核(二)
  2. NLP - Log-linear Models
  3. 【Android 安全】DEX 加密 ( DEX 加密使用到的相关工具 | dx 工具 | zipalign 对齐工具 | apksigner 签名工具 )
  4. Linux-使用 Find 命令找到那些需要清理的文件
  5. QGraphicsScene 的简单理解--关于手册的简要翻译
  6. 《程序员歌单》请查收
  7. linux下I2C驱动发送IO时序,I2C驱动情景分析——怎样控制I2C时序
  8. Golang实践录:xorm使用记录
  9. OpenCV-python学习笔记(二)——image processing图像基本处理
  10. linux压缩隐藏文件,Linux下查看压缩文件内容的10种方法(小结)
  11. [应用代码] android 自动接听电话和挂断 (适合目前所有版本)
  12. java 任务定时调度(定时器)
  13. 在VMware Workstation中创建一个虚拟软盘,并在Windows XP上使用
  14. 重磅!中国首家互联网银行联手腾讯、华为各大APP,最高5万额度,疯狂提额100亿!!!...
  15. 帝国站长php主动推送,帝国CMS 链接主动推送插件设置帮助
  16. access突然需要登录_登录信息提示
  17. 我裸辞全职接单第一个月的收入
  18. Apex Lightning Salesforce 学习笔记及报错问题(持续更新)
  19. 硬件学习 软件Cadence day07 PCB 底板电路图布线
  20. jquery字符串相等判断

热门文章

  1. 你的数据也可以-三篇NAR的数据库
  2. 嗐,别的95后一天两登Nature,你却还不知道有一款工具可以帮你校对英文文稿和回复审稿意见...
  3. vins中imu融合_视觉和imu融合的算法研究
  4. 1.3编程基础之算术表达式与顺序执行 05 计算分数的浮点数值
  5. settimeout需要清除吗_前端20个真正灵魂拷问,前端初级到中级你还需要这个!
  6. RTX5 | 内存池04 - 共享内存用于线程之间的通讯(阻塞方式)- 使用信号量
  7. linux ls命令shell脚本位置,linux - shell脚本到ls并在ls上执行命令结果 - SO中文参考 - www.soinside.com...
  8. 多重选定怎么撤销_多重网络问题怎么解决?如何取消多重网络?
  9. Java工作笔记-webService发布时通用的4个注解
  10. Qt笔记-获取Windows下目前运行的进程信息