0

0

C++ 怎么判断文件是否为空 C++ seekg与tellg检查文件大小代码【IO】

冰火之心

冰火之心

发布时间:2026-01-29 03:31:31

|

238人浏览过

|

来源于php中文网

原创

正确姿势是先以binary模式打开文件并检查is_open(),再seekg(0,end)后立即检查fail(),仅当无错误时用tellg()获取大小并判断是否为0;需避免误将定位失败(如-1)当作空文件,且比较时保持streampos有符号性。

c++ 怎么判断文件是否为空 c++ seekg与tellg检查文件大小代码【io】

seekgtellg 判断文件是否为空的正确姿势

直接调用 seekg(0, std::ios::end) 后再 tellg() 是常见做法,但必须检查 tellg() 是否返回 -1 —— 这表示定位失败(比如文件不可读、是设备文件或权限不足),此时不能当作“空文件”处理。

关键步骤顺序不能错:

  • 先用 open()std::ios::binary 模式打开,避免文本模式下换行符影响位置计算
  • 调用 seekg(0, std::ios::end) 移动到末尾
  • 立刻检查 fail()bad():若为真,tellg() 结果无效
  • 只在无错误时才用 tellg() 获取字节数,等于 0 才是真正空文件

ifstream 构造后不检查状态就调 seekg 的典型错误

很多代码直接写 std::ifstream f("test.txt"); f.seekg(0, std::ios::end);,但没验证 f 是否成功打开。如果文件不存在或无权限,seekg 不会抛异常,而是置位 failbit,后续 tellg() 返回 -1,容易被误判为“空”。

安全写法必须带状态校验:

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

std::ifstream f("test.txt", std::ios::binary);
if (!f.is_open()) {
    // 文件打不开,不是空,是错误
    return false;
}
f.seekg(0, std::ios::end);
if (f.fail()) {
    // seek 失败(例如 /dev/null、/proc/sys/kernel/osrelease 等特殊路径)
    return false;
}
std::streampos size = f.tellg();
return size == 0;

为什么不用 stat()?跨平台和语义差异问题

在 Linux/macOS 上用 stat()st_size 更快、更直接,但它不是 C++ 标准库功能,Windows 需用 GetFileSizeEx() 替代,维护成本高。更重要的是语义差异:stat() 返回的是文件系统元数据中的大小,而 seekg/tellg 走的是流 I/O 路径,对某些特殊文件(如 FIFO、终端、procfs 条目)可能返回不同结果甚至失败。

SoftGist
SoftGist

SoftGist是一个软件工具目录站,每天为您带来最好、最令人兴奋的软件新产品。

下载

如果你明确只处理普通磁盘文件,且项目已用 POSIX 或 Windows API,stat()GetFileSizeEx() 更可靠;但若代码需统一走 std::ifstream 流逻辑(比如后续还要读内容),坚持用 seekg/tellg 并做好错误分支处理更一致。

注意 tellg() 返回类型和符号问题

tellg() 返回 std::streampos,它通常是 long long 或类似有符号整数类型。比较时别写成 if (tellg() == 0u)(无符号),否则当返回 -1 时会被转成极大正数,导致逻辑反转。

正确比较方式只有两种:

  • size == 0sizestd::streampos 类型,保持原类型比较)
  • 或显式转为整数并检查负值:auto sz = static_cast<:streamoff>(size); if (sz

另外,某些老旧编译器或极小嵌入式标准库中,streampos 可能是类类型,重载了 ==,所以不要自行 cast 成 intsize_t 去比。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
if什么意思
if什么意思

if的意思是“如果”的条件。它是一个用于引导条件语句的关键词,用于根据特定条件的真假情况来执行不同的代码块。本专题提供if什么意思的相关文章,供大家免费阅读。

778

2023.08.22

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

208

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

296

2023.10.25

string转int
string转int

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

443

2023.08.02

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

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

544

2024.08.29

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

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

93

2025.08.29

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

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

197

2025.08.29

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

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

762

2023.07.26

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

158

2026.01.28

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 8万人学习

Git 教程
Git 教程

共21课时 | 3.1万人学习

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

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号