讲师中心 微信公众号
AI工具推荐 视频效率加速

c++如何获取文件字节大小_file_size函数与tellg对比【实战】

秋枫君_5474

秋枫君_5474

发布时间:2026-04-06 19:18:02

|

1040人浏览过

|

来源于php中文网

原创

最推荐使用C++17 std::filesystem::file_size:跨平台、不打开文件、支持大文件和UTF-8路径,失败抛异常;Windows专属场景可用_file_size(需_io.h,配对_open/_close);ifstream::tellg须以binary模式打开并检查状态。

c++如何获取文件字节大小_file_size函数与tellg对比【实战】

用 _file_size 获取文件大小:Windows 专属,快但不跨平台

_file_size 是 Microsoft CRT 提供的非标准函数,仅在 Windows 下可用(需 <io.h>),它直接调用系统 API GetFileSize,绕过 C++ 流缓冲,因此极快且不依赖文件是否打开、光标位置或读写模式。

常见错误是把它当通用函数用在 Linux/macOS 编译环境,会报 undefined reference to `_file_size'。另外,它只接受文件描述符(int fd),不是文件名——必须先用 _open 打开文件才能用:

#include <io.h>
int fd = _open("data.bin", _O_RDONLY);
if (fd != -1) {
    long size = _file_size(fd); // 成功返回字节数,失败返回 -1L
    _close(fd);
}
  • 必须配对使用 _open/_close,不能混用 fopen/fclose
  • 返回值类型是 long,对大于 2GB 的文件在 LLP64 环境(如 MSVC x64)下可能截断,建议检查是否为 -1L 并配合 errno
  • 不支持 Unicode 路径(_wopen 可用,但 _file_size 仍只认 fd)

用 std::ifstream::tellg 获取大小:看似简单,实则陷阱密集

很多人试过:std::ifstream f("x.dat"); f.seekg(0, std::ios::end); auto sz = f.tellg(); —— 这在文本模式下可能出错,在二进制大文件上可能慢,甚至返回负值。

根本原因是:默认构造的 std::ifstream 以文本模式打开(std::ios::in),而文本模式会做行尾转换(CRLF → '\n'),导致 seekg(..., end) 的位置不可靠;tellg() 返回的是流内“逻辑位置”,不是真实字节数。

立即学习“C++免费学习笔记(深入)”;

C++14
C++14

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

下载
  • 必须显式指定 std::ios::binary 模式:std::ifstream f("x.dat", std::ios::binary);
  • 必须确保文件成功打开,否则 tellg() 返回 -1(std::streampos(-1))
  • 调用 seekg(0, std::ios::end) 后,要再调用一次 seekg(0, std::ios::beg) 才能继续读,否则流处于 EOF 状态
  • 对某些特殊文件(如设备文件、管道、procfs 条目),seekg 可能失败并置位 failbit

更可靠的选择:C++17 std::filesystem::file_size

这是目前最推荐的方式:标准、跨平台、不打开文件、不依赖流状态,且语义明确。

它底层在 Windows 调用 GetFileSizeEx,Linux/macOS 调用 stat,天然支持大文件(返回 uintmax_t)和 UTF-8 路径(只要 std::filesystem::path 构造正确)。

#include <filesystem>
namespace fs = std::filesystem;
try {
    uintmax_t sz = fs::file_size("log.bin"); // 抛异常而非返回错误码
} catch (const fs::filesystem_error& e) {
    // e.what() 包含具体原因,如 "No such file or directory"
}
  • 不修改文件状态,无副作用,适合只读场景
  • 不支持 stdin/stdout 等非路径资源(这点不如 _file_size(fd) 或 seekg)
  • MSVC 需启用 `/std:c++17` 且链接 `libcmt`(Debug 下注意 `/MDd` vs `/MTd`);GCC/Clang 需 `-lstdc++fs`(GCC<11)或 `-lstdc++`(GCC≥11)

性能与选型建议:别为小文件过度优化

三者实际耗时差异在纳秒到微秒级,除非你在高频循环中查成千上万个文件大小,否则瓶颈从来不在这个函数本身。

  • 写跨平台工具或长期维护项目 → 无条件选 std::filesystem::file_size
  • Windows 专用高性能服务,且已用 CRT 文件描述符管理 I/O → _file_size 更轻量
  • 必须用 std::ifstream 且已打开文件 → 用 seekg + tellg,但务必加 binary 和错误检查

最容易被忽略的是:所有方法都对符号链接默认解析目标文件大小,而不是链接本身(std::filesystem::file_size 行为一致;若需链接自身大小,得用 std::filesystem::symlink_status 查 file_size 字段)。

相关文章

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

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

下载

相关标签:

c++

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

热门AI工具

更多
PixTV
PixTV Hot

PixTV是一款面向AIGC内容创作的AI视频生成工具。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

讯飞绘文

讯飞绘文是一款由科大讯飞推出的一站式 AIGC 内容运营平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

相关专题

更多
fclose函数的用法
fclose函数的用法

fclose是一个C语言和C++中的标准库函数,用于关闭一个已经打开的文件,是文件操作中非常重要的一个函数,用于将文件流与底层文件系统分离,释放相关的资源。更多关于fclose函数的相关问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

822

2023.11.30

string转int
string转int

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

6039

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2965

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

3768

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

2645

2025.08.29

undefined是什么
undefined是什么

undefined是代表一个值或变量不存在或未定义的状态。它可以作为默认值来判断一个变量是否已经被赋值,也可以用于设置默认参数值。尽管在不同的编程语言中,undefined可能具有不同的含义和用法,但理解undefined的概念可以帮助我们更好地理解和编写程序。本专题为大家提供undefined相关的各种文章、以及下载和课程。

11705

2023.07.31

网页undefined是什么意思
网页undefined是什么意思

网页undefined是指页面出现了未知错误的意思,提示undefined一般是在开发网站的时候定义不正确或是转换不正确,或是找不到定义才会提示undefined未定义这个错误。想了解更多的相关内容,可以阅读本专题下面的文章。

5507

2024.08.14

网页undefined啥意思
网页undefined啥意思

本专题整合了undefined相关内容,阅读下面的文章了解更多详细内容。后续继续更新。

2516

2025.12.25

PixTV官网入口地址合集
PixTV官网入口地址合集

本专题汇总了 PixTV AI 一站式视频创作平台的官方入口与使用教程。无需下载软件,浏览器直接访问即可使用。平台将剧本、图像、视频、声音与剪辑整合在“无限画布”中,接入 GPT Image 2.5、Seedance 2.5 等头部模型。本专题整理了从新建画布、角色锚定、分镜拆分到视频生成与导出的完整操作指南,助你快速上手 AI 短剧与漫剧创作。

80

2026.10.10

热门下载

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

精品课程

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

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

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

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn