当前位置: 首页 > news >正文

C++ 第四阶段 文件IO - 第一节:ifstream/ofstream操作

目录

一、文件 IO 的基本概念

二、文件流的基本操作

1. 打开文件

2. 关闭文件

3. 检查文件是否成功打开

三、文本文件的读写操作

1. 写入文本文件(ofstream)

2. 读取文本文件(ifstream)

四、二进制文件的读写操作

1. 写入二进制文件

2. 读取二进制文件

五、文件打开模式

六、异常处理与文件 IO

七、常见错误与调试技巧

八、完整示例

1. 文本文件的读写

2. 二进制文件的读写

九、总结


C++从入门到入土学习导航_c++学习进程-CSDN博客

一、文件 IO 的基本概念

C++ 中的文件 IO(输入/输出)操作主要通过 ifstream(输入文件流)和 ofstream(输出文件流)实现,它们分别用于从文件读取数据和向文件写入数据。

  • ifstream:从文件读取数据(输入流)。
  • ofstream:向文件写入数据(输出流)。
  • fstream:支持同时读取和写入文件(双向流)。

头文件#include <fstream>
继承关系ifstream 继承自 istreamofstream 继承自 ostreamfstream 继承自 iostream


二、文件流的基本操作

1. 打开文件

可以通过以下两种方式打开文件:

  1. 构造函数直接打开
    std::ifstream ifs("example.txt");  // 以只读模式打开文件
    std::ofstream ofs("output.txt");  // 以写入模式打开文件
  2. 使用 open() 方法
    std::ifstream ifs;
    ifs.open("example.txt");  // 以默认模式打开文件
2. 关闭文件

文件操作完成后需调用 close() 方法释放资源:

ifs.close();  // 关闭输入流
ofs.close();  // 关闭输出流
3. 检查文件是否成功打开

使用 is_open() 方法检查文件是否成功打开:

if (!ifs.is_open()) {std::cerr << "文件打开失败!" << std::endl;
}

三、文本文件的读写操作

1. 写入文本文件(ofstream)

使用 << 插入器向文件写入数据:

#include <fstream>
#include <iostream>int main() {std::ofstream ofs("output.txt");if (!ofs) {std::cerr << "无法创建文件!" << std::endl;return 1;}ofs << "Hello, World!" << std::endl;ofs << "This is a test." << std::endl;ofs.close();return 0;
}
2. 读取文本文件(ifstream)

使用 >> 提取器或 getline() 逐行读取数据:

#include <fstream>
#include <iostream>
#include <string>int main() {std::ifstream ifs("output.txt");if (!ifs) {std::cerr << "文件不存在!" << std::endl;return 1;}std::string line;while (std::getline(ifs, line)) {std::cout << line << std::endl;}ifs.close();return 0;
}

四、二进制文件的读写操作

1. 写入二进制文件

使用 write() 方法以二进制格式写入数据:

#include <fstream>
#include <iostream>struct Data {int id;double value;
};int main() {Data data = {1, 3.14};std::ofstream ofs("binary.dat", std::ios::binary);  // 以二进制模式打开if (!ofs) {std::cerr << "无法创建二进制文件!" << std::endl;return 1;}ofs.write(reinterpret_cast<char*>(&data), sizeof(data));  // 写入结构体ofs.close();return 0;
}
2. 读取二进制文件

使用 read() 方法以二进制格式读取数据:

#include <fstream>
#include <iostream>struct Data {int id;double value;
};int main() {Data data;std::ifstream ifs("binary.dat", std::ios::binary);  // 以二进制模式打开if (!ifs) {std::cerr << "无法读取二进制文件!" << std::endl;return 1;}ifs.read(reinterpret_cast<char*>(&data), sizeof(data));  // 读取结构体ifs.close();std::cout << "ID: " << data.id << ", Value: " << data.value << std::endl;return 0;
}

五、文件打开模式

模式描述
std::ios::in以读取模式打开文件(默认用于 ifstream)。
std::ios::out以写入模式打开文件(默认用于 ofstream)。
std::ios::app追加模式,在文件末尾写入内容。
std::ios::binary以二进制模式打开文件(默认是文本模式)。
std::ios::trunc如果文件存在,则清空内容(默认用于 ofstream)。
std::ios::ate打开文件后立即将文件指针定位到文件末尾。

组合模式示例

std::ofstream ofs("log.txt", std::ios::out | std::ios::app);  // 追加写入

六、异常处理与文件 IO

文件操作可能因文件不存在、权限不足等原因失败,需结合异常处理:

#include <fstream>
#include <iostream>
#include <stdexcept>int main() {try {std::ifstream ifs("missing.txt");if (!ifs) {throw std::runtime_error("文件打开失败!");}// 读取文件...} catch (const std::exception& e) {std::cerr << "异常: " << e.what() << std::endl;}return 0;
}

七、常见错误与调试技巧

  1. 文件路径问题

    • 相对路径:相对于当前工作目录(通常为项目根目录)。
    • 绝对路径:如 "C:/Users/YourName/Desktop/file.txt"
    • 解决方法:检查文件是否存在,或使用 std::filesystem::absolute() 获取绝对路径(C++17 起)。
  2. 文件权限问题

    • 确保程序有权限读取/写入目标文件(如修改文件属性或运行程序时以管理员权限启动)。
  3. 二进制文件读写不一致

    • 二进制写入和读取必须使用相同的模式(如 std::ios::binary),否则可能导致数据损坏。
  4. 调试工具

    • 使用 std::cerr 输出错误信息。
    • 使用 Valgrind 检测内存泄漏。
    • 使用 GDB 或 IDE 调试器逐步执行代码。

八、完整示例

1. 文本文件的读写
#include <fstream>
#include <iostream>
#include <string>int main() {// 写入文件std::ofstream ofs("example.txt");if (ofs) {ofs << "C++ 文件 IO 示例" << std::endl;ofs << "这是第二行内容。" << std::endl;ofs.close();}// 读取文件std::ifstream ifs("example.txt");if (ifs) {std::string line;while (std::getline(ifs, line)) {std::cout << line << std::endl;}ifs.close();}return 0;
}
2. 二进制文件的读写
#include <fstream>
#include <iostream>struct Student {int id;std::string name;
};int main() {Student student = {101, "Alice"};std::ofstream ofs("students.dat", std::ios::binary);if (ofs) {ofs.write(reinterpret_cast<char*>(&student), sizeof(Student));ofs.close();}Student readStudent;std::ifstream ifs("students.dat", std::ios::binary);if (ifs) {ifs.read(reinterpret_cast<char*>(&readStudent), sizeof(Student));ifs.close();std::cout << "ID: " << readStudent.id << ", Name: " << readStudent.name << std::endl;}return 0;
}

九、总结

通过 ifstreamofstream,可以高效地实现 C++ 中的文件读写操作。关键点包括:

  1. 正确使用文件模式(如 std::ios::binarystd::ios::app)。
  2. 检查文件是否成功打开is_open())。
  3. 结合异常处理try/catch)确保程序健壮性。
  4. 区分文本和二进制文件的读写方式
  5. 调试文件路径和权限问题,避免因环境问题导致失败。
http://www.dtcms.com/a/264800.html

相关文章:

  • JavaScript---查询数组符合条件的元素
  • 解决 npm install canvas@2.11.2 失败的问题
  • 【公司环境下发布个人NPM包完整教程】
  • SPI、I2C和UART三种串行通信协议的--------简单总结
  • NLP:文本张量表示方法
  • 【安全工具】SQLMap 使用详解:从基础到高级技巧
  • 【字节跳动】数据挖掘面试题0001:打车场景下POI与ODR空间关联查询
  • C++实现状态机
  • 20250703|Leetcodehot100之739【】今天计划
  • Linux环境下使用 C++ 与 OpenCV 实现 ONNX 分类模型推理
  • 洛谷P2119 [NOIP 2016 普及组] 魔法阵【题解】【前缀和优化】
  • Java 大视界 -- Java 大数据在智能医疗健康管理中的慢性病风险预测与个性化干预(330)
  • Javaee 多线程 --进程和线程之间的区别和联系
  • nvm:NodeJs版本管理工具下载安装与使用教程
  • macOS挂载iOS应用沙盒文件夹
  • 飞算 JavaAI 智控引擎:全链路开发自动化新图景
  • 【字节跳动】数据挖掘面试题0003:有一个文件,每一行是一个数字,如何用 MapReduce 进行排序和求每个用户每个页面停留时间
  • 橡胶硬度计在不同领域中的应用
  • mybatis考试
  • 无人机一机多控技术的核心要点
  • 亿级物联网MQTT集群:OpenResty深度优化实践
  • Docker for Windows 设置国内镜像源教程
  • 基于spark的航班价格分析预测及可视化
  • v3 中的storeToRefs
  • AWS WebRTC:根据viewer端拉流日志推算视频帧率和音频帧率
  • uniapp实现图片预览,懒加载
  • 数据分类分级系统的建设思路
  • Rust 安装使用教程
  • 【已解决】执行conda init提示No action taken.
  • 客服机器人知识库怎么搭?智能客服机器人3种方案深度对比(含零售落地案例)