C++ 怎么获取文件大小 C++ file_size函数与seekp用法【IO】
发布时间 - 2026-02-02 00:00:00 点击率:次最推荐用 std::filesystem::file_size,但需 C++17 支持且路径必须为真实常规文件;否则可用 seekg + tellg(须二进制模式并检查状态);seekp 不可用于获取文件大小。
用 std::filesystem::file_size 最直接,但要注意 C++17 及路径有效性
这是目前最推荐的方式,无需手动打开文件、不依赖流状态,一行就能拿到字节数:std::filesystem::file_size("path.txt")。但它要求编译器支持 C++17(GCC 8+、Clang 7+、MSVC 2017 15.7+),且传入的路径必须是真实存在的常规文件——如果路径不存在、是目录、或权限不足,会抛出 std::filesystem::filesystem_error 异常。
常见错误现象:程序崩溃或未捕获异常导致终止;误把符号链接当普通文件(默认不解析);在 Windows 上传入带中文路径但没用 UTF-8 编码的 std::filesystem::path 对象。
- 确保开启 C++17:编译时加
-std=c++17(GCC/Clang)或设置项目标准为 C++17(MSVC) - 检查路径存在性:先调用
std::filesystem::exists(p)和std::filesystem::is_regular_file(p) - 处理符号链接:如需解析,用
std::filesystem::file_size(p, ec)配合std::error_code,或显式调用std::filesystem::canonical(p)
用 seekg + tellg 获取大小,适用于老标准或需要复用已打开流的场景
当不能用 std::filesystem(比如要兼容 C++11),或你已经以 std::ifstream 打开了文件并想顺便查大小,可以用定位 + 查询方式。核心是:将读位置移到末尾,再读当前位置值。
关键点不是 seekp(那是输出流用的),而是输入流的 seekg。常见错误是忘记清空流状态位(如 failbit)、没指定 std::ios::end 模式、或用 tellg() 返回 -1 后未判断就直接当大小用。
- 必须用
std::ios::binary模式打开,否则文本模式下seekg行为不可靠(尤其 Windows 换行符) - 调用
seekg(0, std::ios::end)后,立即检查!ifs.fail();失败则大小未知 -
tellg()返回std::streampos,转std::uintmax_t前先确认非-1(static_cast<:uintmax_t>(pos)) - 别忘了把位置移回开头(如后续还要读):
ifs.seekg(0, std::ios::beg)
seekp 在输出流里不能用来“查大小”,但能控制写入位置
seekp 是 std::ofstream 或 std::fstream(输出方向)的成员函数,只影响下次写入的起始偏移,和当前文件长度无关。有人误以为 ofs.seekp(0, std::ios::end); ofs.tellp() 能得到大小,这在文件刚创建且没写入时可能碰巧对,但一旦文件有内容、或被其他进程修改、或流缓冲未刷新,结果就不可信。
真正可靠的大小始终以磁盘上实际字节数为准,seekp/tellp 只反映流内部写指针位置,不等于文件系统元数据。
- 不要用
tellp()替代file_size()或tellg() - 若需“扩展写入”,比如跳过一段空白填数据,
seekp是合适的,但得确保文件已存在且足够大,或先用seekp写零填充 - 写入后记得
ofs.flush(),否则tellp()可能滞后于实际磁盘写入
跨平台注意:Windows 上 std::filesystem 路径编码容易踩坑
在 MSVC 下,std::filesystem::path 默认用窄字符串(char),但 Windows API 实际期望 UTF-16。如果路径含中文、日文等,直接传 "测试.txt" 字面量,在非 UTF-8 系统 locale 下大概率失败。
- 安全做法:用
std::filesyste(C++20)或手动构造
m::u8path(u8"测试.txt")
std::filesystem::path从宽字符串(std::wstring) - GCC/Clang 在 Linux/macOS 下通常没问题,但也要避免硬编码 locale 相关的字节序列
- 调试时打印
std::filesystem::absolute(p).string()看是否乱码,是快速定位编码问题的手段
file_size 最简洁,但异常和编码是高频失手点;seekg/tellg 更底层,适合嵌入已有 IO 流逻辑,但二进制模式和状态检查缺一不可;至于 seekp,它真不是用来查大小的。
# linux
# windows
# 编码
# 字节
# mac
# ai
# c++
# ios
# macos
# win
# stream
# cos
# String
# 成员函数
# Filesystem
# 字符串
# char
# 指针
# 接口
# ofstream
# ifstream
# fstream
# 对象
# 文件系统
# 这是
# 那是
# 就能
# 日文
# 也要
# 就不
# 已有
# 可以用
# 适用于
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
Laravel怎么进行数据库回滚_Laravel Migration数据库版本控制与回滚操作
Laravel怎么连接多个数据库_Laravel多数据库连接配置
WEB开发之注册页面验证码倒计时代码的实现
Laravel Docker环境搭建教程_Laravel Sail使用指南
香港服务器部署网站为何提示未备案?
开心动漫网站制作软件下载,十分开心动画为何停播?
Laravel如何使用Passport实现OAuth2?(完整配置步骤)
JS中使用new Date(str)创建时间对象不兼容firefox和ie的解决方法(两种)
Edge浏览器提示“由你的组织管理”怎么解决_去除浏览器托管提示【修复】
javascript中闭包概念与用法深入理解
最好的网站制作公司,网购哪个网站口碑最好,推荐几个?谢谢?
Laravel如何处理表单验证?(Requests代码示例)
Laravel如何集成微信支付SDK_Laravel使用yansongda-pay实现扫码支付【实战】
javascript事件捕获机制【深入分析IE和DOM中的事件模型】
网站图片在线制作软件,怎么在图片上做链接?
如何在腾讯云免费申请建站?
如何在万网自助建站平台快速创建网站?
nginx修改上传文件大小限制的方法
Laravel如何配置中间件Middleware_Laravel自定义中间件拦截请求与权限校验【步骤】
,怎么在广州志愿者网站注册?
Internet Explorer官网直接进入 IE浏览器在线体验版网址
Laravel广播系统如何实现实时通信_Laravel Reverb与WebSockets实战教程
EditPlus中的正则表达式 实战(1)
Laravel如何使用软删除(Soft Deletes)功能_Eloquent软删除与数据恢复方法
网站优化排名时,需要考虑哪些问题呢?
如何在建站之星绑定自定义域名?
Laravel如何使用Vite进行前端资源打包?(配置示例)
消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工
5种Android数据存储方式汇总
Laravel如何配置Horizon来管理队列?(安装和使用)
Laravel怎么进行浏览器测试_Laravel Dusk自动化浏览器测试入门
如何快速搭建支持数据库操作的智能建站平台?
Python高阶函数应用_函数作为参数说明【指导】
如何在腾讯云服务器快速搭建个人网站?
Laravel怎么使用Session存储数据_Laravel会话管理与自定义驱动配置【详解】
今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】
Win11怎么恢复误删照片_Win11数据恢复工具使用【推荐】
Laravel策略(Policy)如何控制权限_Laravel Gates与Policies实现用户授权
香港服务器网站搭建教程-电商部署、配置优化与安全稳定指南
Laravel如何设置定时任务(Cron Job)_Laravel调度器与任务计划配置
如何在IIS中新建站点并配置端口与IP地址?
学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?
怎么用AI帮你为初创公司进行市场定位分析?
无锡营销型网站制作公司,无锡网选车牌流程?
如何在局域网内绑定自建网站域名?
html5如何设置样式_HTML5样式设置方法与CSS应用技巧【教程】
Laravel如何实现API速率限制?(Rate Limiting教程)
邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?
Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程
Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】


