如何读取文本文件的最后100行?

anvizh 2008-06-21 11:29:10
我想读取文件的最后100行,有什么好方法呢?文件可能会比较大,从头开始读就不现实了。
有没有方法可以从后面往前读,每次读一行呢?
...全文
1176 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
czx605 2008-06-22
  • 打赏
  • 举报
回复
int fseek(FILE *fp,long d,int pos)
fp是文件指针,d是位移量, pos是起始点。
Pos的取值为:
0 :文件开始处
1 :文件的当前位置
2 :文件的尾部
lin_style 2008-06-22
  • 打赏
  • 举报
回复
从后往前。批量读到缓冲进行判断

计算\n结束符

对缓冲大小控制得好,速度还是很快的。

csdn5211 2008-06-22
  • 打赏
  • 举报
回复
连五星都出动了?这个要处理的文件是你自己可以控制内容的吗?如果是,最好一开始就加上索引。否则只好一点点往后读了。
grellen 2008-06-22
  • 打赏
  • 举报
回复
up .
K行天下 2008-06-22
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 k2eats 的回复:]
先计算有多少行
然后读取最后十行
[/Quote]
哦!最后一百行

先计算有多少行 ,
然后跳过前面的 '\n', 直到最后读取一百行
K行天下 2008-06-22
  • 打赏
  • 举报
回复
先计算有多少行
然后读取最后十行
dongxyang 2008-06-22
  • 打赏
  • 举报
回复
可以看看Unix中的tail命令是怎么写的
jixingzhong 2008-06-22
  • 打赏
  • 举报
回复
tail -n 100 //这是unix命令,如果楼主你的环境是确定为unix系统,倒是可以这么偷懒···
jixingzhong 2008-06-22
  • 打赏
  • 举报
回复
由于是要读取末尾的 100行,而不是 末尾的 100字符,
所以暂时没啥特殊的办法,
getline读取行吧,缓冲最新getline获得的10条数据即可
mhyx_2008 2008-06-22
  • 打赏
  • 举报
回复
肯定要用fseek();
每读一个字符向开头的方向移2位,直到定位盗100个‘\n’的位置处,然后再用fgets()读
clhposs 2008-06-22
  • 打赏
  • 举报
回复
最简单的方法 (*^__^*) 嘻嘻……

首先全部读取到vector

然后向后循环100次 不就100行
fallening 2008-06-22
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 iambic 的回复:]
tail -n 100
[/Quote]
yeah
czx605 2008-06-22
  • 打赏
  • 举报
回复
用fseek定位idao末尾
定义一个栈
从末尾开始移动指针并把值入栈,碰到‘\n’
就计数直到计数到10,然后出栈
lin_style 2008-06-22
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 anvizh 的回复:]
肯定要用fseek();
每读一个字符向开头的方向移2位,直到定位盗100个‘\n’的位置处,然后再用fgets()读
=============================

我用的就是这种方法。
我要用C++或tcl实现,并且要在Unix和Windows上用。。。
这个处理要求实时性比较高,无论用什么缓冲,只要从文件头开始读都应该不可行,文件大的话,耗时。
多谢了!!!
[/Quote]

你能大概计算出每行的大小吗?
能计算出的话,
假设每行大小是m(这个值要大于标准值若干)
文件大小是S
假设当前行数是 nline=m/S
先移动到 fseek->S-(100*nline)
再从S-(100*nline)这个点到末尾把内容都读出来
因为一开始的m是大于标准值若干,所以这时候读出来的内容是略大于100行的大小,
接着对这个内容进行处理

消耗的复杂度为
nline=m/S 常数
fseek->S-(100*nline) 系统处理,估计也是常数,可以直接移动
再从S-(100*nline)这个点到末尾把内容都读出来 一个拷贝的过程,读出来的内容是略大于100行的大小
接着对读出的内容处理,消耗也不会大,因为这个时候大小是接近100行的大小
蓝翔技校码农 2008-06-22
  • 打赏
  • 举报
回复
先计算有多少行,然后使用指针定位读取。
visame 2008-06-22
  • 打赏
  • 举报
回复
fseek可以吗?
我认为只能从头开始读,一条条替换,直到最后100条
想想外排序的方法。
anvizh 2008-06-22
  • 打赏
  • 举报
回复
肯定要用fseek();
每读一个字符向开头的方向移2位,直到定位盗100个‘\n’的位置处,然后再用fgets()读
=============================

我用的就是这种方法。
我要用C++或tcl实现,并且要在Unix和Windows上用。。。
这个处理要求实时性比较高,无论用什么缓冲,只要从文件头开始读都应该不可行,文件大的话,耗时。
多谢了!!!
wuyu637 2008-06-22
  • 打赏
  • 举报
回复
tail 不是c++的东西,是linux的一个小工具,看楼主的意思应该是要在c++读取文件中的最后几行,

比较好的方法就是 fseek()
herman~~ 2008-06-22
  • 打赏
  • 举报
回复
呵呵,是用WINAPI读吗?还是linux?
没明白
iambic 2008-06-21
  • 打赏
  • 举报
回复
tail -n 100

64,281

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧