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 前先确认非 -1static_cast<:uintmax_t>(pos)
  • 别忘了把位置移回开头(如后续还要读):ifs.seekg(0, std::ios::beg)

seekp 在输出流里不能用来“查大小”,但能控制写入位置

seekpstd::ofstreamstd::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

    m::u8path(u8"测试.txt")
    (C++20)或手动构造 std::filesystem::path 从宽字符串(std::wstring
  • GCC/Clang 在 Linux/macOS 下通常没问题,但也要避免硬编码 locale 相关的字节序列
  • 调试时打印 std::filesystem::absolute(p).string() 看是否乱码,是快速定位编码问题的手段
实际文件大小永远由文件系统决定,所有 C++ 接口只是读取它的快照。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


相关推荐: Gemini怎么用新功能实时问答_Gemini实时问答使用【步骤】  php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】  百度浏览器如何管理插件 百度浏览器插件管理方法  php后缀怎么变mp4格式错误_修改扩展名提示格式不对怎么办【技巧】  北京企业网站设计制作公司,北京铁路集团官方网站?  如何在IIS中新建站点并解决端口绑定冲突?  Laravel怎么使用Markdown渲染文档_Laravel将Markdown内容转HTML页面展示【实战】  Laravel 419 page expired怎么解决_Laravel CSRF令牌过期处理  Laravel事件和监听器如何实现_Laravel Events & Listeners解耦应用的实战教程  如何快速搭建个人网站并优化SEO?  HTML5段落标签p和br怎么选_文本排版常用标签对比【解答】  Laravel怎么返回JSON格式数据_Laravel API资源Response响应格式化【技巧】  海南网站制作公司有哪些,海口网是哪家的?  Laravel如何自定义错误页面(404, 500)?(代码示例)  Laravel控制器是什么_Laravel MVC架构中Controller的作用与实践  Laravel Vite是做什么的_Laravel前端资源打包工具Vite配置与使用  弹幕视频网站制作教程下载,弹幕视频网站是什么意思?  济南网站建设制作公司,室内设计网站一般都有哪些功能?  详解Nginx + Tomcat 反向代理 如何在高效的在一台服务器部署多个站点  Laravel如何保护应用免受CSRF攻击?(原理和示例)  MySQL查询结果复制到新表的方法(更新、插入)  使用豆包 AI 辅助进行简单网页 HTML 结构设计  Win11怎么设置虚拟桌面 Win11新建多桌面切换操作【技巧】  1688铺货到淘宝怎么操作 1688一键铺货到自己店铺详细步骤  php 三元运算符实例详细介绍  零服务器AI建站解决方案:快速部署与云端平台低成本实践  java中使用zxing批量生成二维码立牌  软银砸40亿美元收购DigitalBridge 强化AI资料中心布局  网站建设整体流程解析,建站其实很容易!  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  网页设计与网站制作内容,怎样注册网站?  太平洋网站制作公司,网络用语太平洋是什么意思?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  Laravel如何安装使用Debugbar工具栏_Laravel性能调试与SQL监控插件【步骤】  Linux网络带宽限制_tc配置实践解析【教程】  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  Android中AutoCompleteTextView自动提示  如何在 Telegram Web View(iOS)中防止键盘遮挡底部输入框  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  如何快速搭建支持数据库操作的智能建站平台?  jquery插件bootstrapValidator表单验证详解  google浏览器怎么清理缓存_谷歌浏览器清除缓存加速详细步骤  北京网站制作的公司有哪些,北京白云观官方网站?  Laravel如何处理JSON字段_Eloquent原生JSON字段类型操作教程  北京专业网站制作设计师招聘,北京白云观官方网站?  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  如何在阿里云高效完成企业建站全流程?  大同网页,大同瑞慈医院官网?  如何在阿里云购买域名并搭建网站?  HTML5空格和nbsp有啥关系_nbsp的作用及使用场景【说明】