c++如何实现类似tail -n的快速读取文件最后几行功能【技巧】

秋杰同学_4044

秋杰同学_4044

2026-04-08

217人浏览

原创

因为换行符长度不固定且末尾可能有空行或无换行符,直接 fseek(fp, -n, SEEK_END) 会切在行中间;需从文件末尾逐字节倒扫统计 '\n' 个数,定位第 k 个换行符位置。

c++如何实现类似tail -n的快速读取文件最后几行功能【技巧】

为什么不能直接用 fseek(fp, -n, SEEK_END) 跳到末尾前 n 字节?

因为换行符 '\n' 长度是 1 字节,但文件末尾可能有空行、Windows 的 "\r\n"、或最后一行没换行符。直接倒退固定字节数会切在行中间,导致读出乱码或漏行。真正要找的是「第 k 个换行符从后往前的位置」,不是字节偏移。

用 fseek + 单字节倒扫找换行符的可靠做法

打开文件后,先 fseek(fp, 0, SEEK_END) 定位到末尾,然后逐字节往回读,统计遇到的 '\n' 个数。注意边界:文件为空、只有 1 行、末尾有多个 '\n' 都要处理。

  • 初始化 pos = ftell(fp) - 1,避免读到 EOF 后再减一越界
  • 每次 fseek(fp, pos, SEEK_SET) 后 fread(&c, 1, 1, fp),检查 c == '\n'
  • 找到第 n 个 '\n' 后,下一行就是目标起始位置(pos + 1)
  • 若扫到文件头还没凑够 n 行,就从开头读起(说明总行数 n)

std::ifstream 配合 rdbuf() 和 std::string 的坑

有人想用 std::string content((std::istreambuf_iterator(file)), {}) 一次性读全再 std::count 换行符——这在大文件(几百 MB 以上)会爆内存,且 std::string 构造本身慢。C++ 标准库没有内置「反向逐行迭代器」,强行用 std::vector<:string> 存所有行更浪费。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 不要把整个文件 load 到内存做 split
  • 避免用 std::getline 正向读完再取后几行(O(N) 时间且无法提前退出)
  • 如果必须用流,可用 file.seekg(0, std::ios::end) + file.tellg() 获取长度,再手动倒扫

跨平台换行符兼容:只认 '\n' 就够了?

Linux/macOS 是 '\n',Windows 是 "\r\n",但 C++ 文件以文本模式打开时,std::ifstream 或 C 的 FILE* 默认会把 "\r\n" 当作单个 '\n' 处理(即转换已由底层完成)。所以倒扫时只需识别 '\n',无需处理 '\r' ——前提是打开文件时没加 std::ios::binary 或 "rb" 模式。

  • 用文本模式(默认):倒扫找 '\n' 即可,系统自动归一化
  • 用二进制模式:必须同时处理 "\r\n" 和 '\n',逻辑变复杂,一般没必要
  • 最后一行无换行符时,倒扫会少计 1 行,需在循环结束后额外判断是否还有内容

实际最稳的做法是:用 C 风格 FILE*,fseek 到末尾,倒扫统计 '\n',定位后用 fgets 或 fread 读剩余部分。核心难点不在代码长短,而在边界条件——比如文件以 \n\n 结尾,你要的其实是倒数第 2 个 \n 后面那行,而不是最后一个空行。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

6999

3

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.20

3568

5

fgets在c语言中的用法
fgets在c语言中的用法

本专题整合了c语言中fgets用法介绍,阅读专题下面的文章了解更多详细内容。

2025.08.27

153

4

windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.07.26

3359

3

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.07.27

2918

6

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

2023.08.01

1528

3

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

2023.08.02

2659

5

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2023.08.08

3330

4

windows自动更新
windows自动更新

Windows操作系统的自动更新功能可以确保系统及时获取最新的补丁和安全更新,以提高系统的稳定性和安全性。然而,有时候我们可能希望暂时或永久地关闭Windows的自动更新功能。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.10

1677

3

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习