0

0

C++ 怎么判断文件是否为空 C++ peek与seekg检查文件【文件流】

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-01-27 12:58:03

|

855人浏览过

|

来源于php中文网

原创

用 peek() 判断文件是否为空最直接:先检查 is_open() 和 good(),再调用 peek(),若返回 eof() 且 good() 为 true,则文件为空;seekg(0, ios::end) + tellg() 更可靠但会改变流位置,需恢复且处理 size == -1 情况。

c++ 怎么判断文件是否为空 c++ peek与seekg检查文件【文件流】

peek() 判断文件是否为空最直接

打开文件后立刻调用 peek(),如果返回 std::char_traits::eof(),说明文件没内容(空或读取失败)。注意:必须确保流处于 good 状态,且未被其他操作干扰。

常见错误是忽略流状态检查,比如文件不存在时 peek() 也返回 eof(),但此时 failbit 已置位。所以得先确认 is_open()good()

  • std::ifstream f("test.txt"); if (!f.is_open()) { /* 处理打开失败 */ }
  • if (f.peek() == std::char_traits::eof()) { /* 可能为空,但需再验证 f.good() */ }
  • f.good() 为 true 且 peek() 返回 eof(),基本可断定为空

seekg(0, std::ios::end) 配合 tellg() 更可靠但有代价

适用于需要精确字节数、或后续还要读内容的场景。先定位到末尾,再用 tellg() 获取长度;若返回 -1 表示定位失败(比如设备文件、管道),不是空文件而是不可测大小。

关键点:

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

  • f.seekg(0, std::ios::end); auto size = f.tellg(); —— 必须成对使用,且 seekg() 后要检查 f.good()
  • size == 0 才表示真正为空;size == -1 不代表空,可能是 /dev/null 或网络流
  • 该方法会改变流位置,后续读取前需 seekg(0) 回开头,否则读不到内容
  • 对某些文件系统(如 NFS)或特殊文件,tellg() 可能不准或阻塞

为什么不用 !ff.eof() 判断空文件

!f 检查的是流整体状态(failbit/badbit),不能区分“空”和“打不开”;f.eof() 是读取操作后的状态标记,初始时永远为 false,直接调用毫无意义。

听脑AI
听脑AI

听脑AI语音,一款专注于音视频内容的工作学习助手,为用户提供便捷的音视频内容记录、整理与分析功能。

下载

典型误用:

  • if (f.eof()) { ... } —— 刚打开就调用,恒为 false
  • if (!f) { ... } —— 文件不存在、权限不足、路径错误都会触发,和“空”无关
  • f >> buf; if (!f) { ... } —— 即使文件非空但首字符是空白,也可能因格式提取失败而误判

综合建议:按场景选方法,别只看代码短

快速判断且不关心细节:用 peek() + good() 组合,轻量、语义清晰。

需要知道确切大小、或后续要重读全部内容:用 seekg()/tellg(),但记得恢复位置并处理 -1 边界。

容易被忽略的是:文本模式下 Windows 的 \r\n 换行不影响字节长度判断,但若用 getline() 读取后再判断 eof(),可能因最后一行无换行符导致逻辑错乱——空文件检测这事,最好在任何读取操作前完成。

热门AI工具

更多
DeepSeek
DeepSeek

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

豆包大模型
豆包大模型

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

通义千问
通义千问

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

腾讯元宝
腾讯元宝

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

文心一言
文心一言

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

讯飞写作
讯飞写作

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

即梦AI
即梦AI

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

ChatGPT
ChatGPT

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

相关专题

更多
c++和c语言的区别有哪些
c++和c语言的区别有哪些

c++和c语言的区别:1、面向对象编程(OOP)支持不同;2、新增特性不同;3、标准库不同;4、编译方式不同;5、命名空间不同等等。想了解更多c++的相关内容,可以阅读本专题下面的文章。

258

2024.03.14

c++和python学习顺序推荐
c++和python学习顺序推荐

一般建议先学习C++,再学习Python,因为这样可以逐步从较为底层的编程语言向更高级的语言过渡。想了解更多python的相关内容,可以阅读本专题下面的文章。

423

2024.03.14

python和c++学习性价比分析
python和c++学习性价比分析

Python易于学习,广泛应用于Web开发、数据科学和人工智能等领域,但性能较低。C语言性能高,适用于对性能要求较高的场景,如游戏开发和系统编程,但学习曲线陡峭,错误处理复杂。想了解更多python的相关内容,可以阅读本专题下面的文章。

103

2024.03.14

c语言和c++一样吗
c语言和c++一样吗

c语言和c++是两种不同的编程语言,虽然有相似之处,但存在显著差异。c语言专注于过程式编程和系统级开发,以简洁、高效著称。c++作为c语言的超集,引入了面向对象编程,增强了代码组织和管理能力,但学习曲线也更陡峭。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

135

2024.03.14

c语言和c++先学哪个好
c语言和c++先学哪个好

初学者选择学习c语言还是c++语言,需要根据个人学习目标、背景以及编程兴趣和预期应用方向来决定。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

101

2024.03.14

c语言和c++的区别和联系
c语言和c++的区别和联系

c语言和c++是计算机科学领域应用广泛的编程语言。虽然它们有着相似的基础,但它们在语言类型、语法功能和内存管理方面存在着显著差异。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

123

2024.03.14

c++软件中文更改教程
c++软件中文更改教程

对于 ide,可通过打开设置,找到语言设置,选择中文,并保存更改。对于非 ide 应用程序,可查找设置或选项,选择语言设置,更改为中文,并保存更改。想了解更多c++的相关内容,可以阅读本专题下面的文章。

303

2024.03.21

python和java和c++学习性价比分析
python和java和c++学习性价比分析

Python以其易学性、丰富的库和活跃的社区而著称,适合数据科学、人工智能和Web开发。Java以其跨平台性、企业级应用开发和Android应用开发而闻名。C++以其底层控制能力、高效性能和游戏开发而著称。选择哪种语言取决于个人兴趣、职业方向和特定需求。想了解更多python和java和c++的相关内容,可以阅读本专题下面的文章。

335

2024.03.22

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

6

2026.01.27

热门下载

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

精品课程

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

共32课时 | 4.2万人学习

Go语言实战之 GraphQL
Go语言实战之 GraphQL

共10课时 | 0.8万人学习

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

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