0

0

C++中如何实现文件读写操作?(使用fstream库中的输入输出流)

穿越時空

穿越時空

发布时间:2026-01-12 09:05:02

|

939人浏览过

|

来源于php中文网

原创

用 std::ifstream 安全读取文本文件的关键是检查打开失败而非能否打开,需用 is_open() 或流对象布尔判断;默认以 ios::in 模式打开,不支持写入;推荐 std::getline() 逐行读取,避免 >> 读字符串。

c++中如何实现文件读写操作?(使用fstream库中的输入输出流)

直接用 std::ifstreamstd::ofstream 就能完成绝大多数文件读写需求,不需要手动管理缓冲区或系统调用。

如何用 std::ifstream 安全读取文本文件

关键不是“能不能打开”,而是“打开失败时程序是否崩溃”。必须检查 is_open() 或直接用流对象作布尔判断。

  • std::ifstream 默认以 std::ios::in 模式打开,不支持写入;若文件不存在或无权限,构造后流状态为 failbit
  • 逐行读推荐用 std::getline(),它会自动丢弃换行符,且不会因空行中断
  • 避免用 >> 运算符读字符串——遇到空格/制表符就停,且无法区分读到末尾还是格式错误
std::ifstream fin("data.txt");
if (!fin) {  // 等价于 if (fin.fail())
    std::cerr << "无法打开 data.txt\n";
    return;
}
std::string line;
while (std::getline(fin, line)) {
    std::cout << line << "\n";
}

如何用 std::ofstream 控制写入行为(覆盖 vs 追加)

默认是覆盖写入,想追加必须显式指定 std::ios::app 模式;但要注意:app 模式下所有写入都强制定位到文件末尾,seekp() 无效。

  • 覆盖写:直接构造 std::ofstream("out.txt"),或显式传 std::ios::out
  • 追加写:必须用 std::ofstream("out.txt", std::ios::app)
  • 清空并重写:先用 std::ofstream("out.txt", std::ios::trunc),但 trunc 是默认行为,通常不用显式写
std::ofstream fout("log.txt", std::ios::app);  // 追加模式
if (fout) {
    fout << "new entry at " << std::time(nullptr) << "\n";
}

二进制读写必须用 std::ios::binary 标志

不加 binary 模式,在 Windows 上读写二进制文件会导致 \r\n 被悄悄转成 \n(或反之),数据损坏。这是跨平台开发中最常被忽略的坑。

OmniAudio
OmniAudio

OmniAudio 是一款通过 AI 支持将网页、Word 文档、Gmail 内容、文本片段、视频音频文件都转换为音频播客,并生成可在常见 Podcast ap

下载

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

  • 读二进制:用 std::ifstream("file.dat", std::ios::binary) + read()
  • 写二进制:用 std::ofstream("file.dat", std::ios::binary) + write()
  • read()write() 的第二个参数是字节数,不是元素个数;对结构体写入要确保没有内存对齐填充干扰
struct Record { int id; double value; };
Record r = {42, 3.14};
std::ofstream binout("data.bin", std::ios::binary);
binout.write(reinterpret_cast(&r), sizeof(r));

关闭文件和异常处理的实用建议

fstream 对象析构时会自动关闭文件,所以局部变量一般不用手动调 close();但如果你需要立刻释放句柄、或检查写入是否真正落盘,则必须调 close() 并检查其返回值。

  • close() 失败可能意味着磁盘满、权限丢失或 I/O 错误,仅靠析构无法捕获这类问题
  • 不要依赖 exceptions() 开启异常——它会让流在任何状态位变化时抛异常(包括 eofbit),反而难处理
  • 更稳妥的做法是每次操作后查 good() / fail() / bad(),尤其在循环中
std::ofstream fout("tmp.txt");
fout << "hello";
if (!fout.good()) {
    std::cerr << "写入失败\n";
}
fout.close();  // 此时才真正 flush 并检查底层错误
if (!fout.good()) {
    std::cerr << "close 失败,可能未写入磁盘\n";
}

文件路径中的反斜杠在 C++ 字符串里要写成双反斜杠 "C:\\data\\input.txt",或者用原始字符串字面量 R"(C:\data\input.txt)";另外,fstream 不支持 Unicode 路径(如含中文名),Windows 下需改用 _wfopen 或第三方库。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1463

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

228

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

85

2025.10.17

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

254

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

206

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1463

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

617

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

548

2024.03.22

Java 项目构建与依赖管理(Maven / Gradle)
Java 项目构建与依赖管理(Maven / Gradle)

本专题系统讲解 Java 项目构建与依赖管理的完整体系,重点覆盖 Maven 与 Gradle 的核心概念、项目生命周期、依赖冲突解决、多模块项目管理、构建加速与版本发布规范。通过真实项目结构示例,帮助学习者掌握 从零搭建、维护到发布 Java 工程的标准化流程,提升在实际团队开发中的工程能力与协作效率。

4

2026.01.12

热门下载

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

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
10分钟--Midjourney创作自己的漫画
10分钟--Midjourney创作自己的漫画

共1课时 | 0.1万人学习

Midjourney 关键词系列整合
Midjourney 关键词系列整合

共13课时 | 0.9万人学习

AI绘画教程
AI绘画教程

共2课时 | 0.2万人学习

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

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