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.pswp.cn/web/87796.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/87796.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

容声W60以光水离子科技实现食材“主动养鲜”

炎炎夏日&#xff0c;孩子沉迷电视手机屏幕&#xff0c;视力堪忧&#xff1f;高价买回的“超级食物”羽衣甘蓝、车厘子&#xff0c;几天就蔫了&#xff1f;切开的西瓜放进冰箱&#xff0c;却怕沾染细菌&#xff1f;7月5日&#xff0c;容声冰箱“WILL养鲜 高能一夏”新品发布会给…

力扣面试150(13/150)

7.3 380. O(1) 时间插入、删除和获取随机元素 实现RandomizedSet 类&#xff1a; RandomizedSet() 初始化 RandomizedSet 对象bool insert(int val) 当元素 val 不存在时&#xff0c;向集合中插入该项&#xff0c;并返回 true &#xff1b;否则&#xff0c;返回 false 。bool…

需要scl来指定编译器的clangd+cmake在vscode/cursor开发环境下的配置

最近cursor更新了插件商店&#xff0c;只能使用默认它魔改的c/c插件&#xff08;基于clangd的&#xff09;&#xff0c;手头刚好在折腾一个cmake工程&#xff0c;试试水尝试直接配置在cursor上可以编译运行。 主要是本地环境使用scl来管理gcc/g&#xff0c;所以在配置过程中需要…

docker离线/在线环境下安装elasticsearch

如果想离线安装docker、redis、gninx、mysql可参照下面这个。 离线环境下&#xff0c;docker安装redis、ngnix、mysql 获取离线包 方式1 找一个能上网的环境&#xff0c;下载elasticsearch的镜像&#xff0c;然后将这个镜像导出 docker pull docker.elastic.co/elasticsear…

响应式编程入门教程第一节:揭秘 UniRx 核心 - ReactiveProperty - 让你的数据动起来!

响应式编程入门教程第一节&#xff1a;揭秘 UniRx 核心 - ReactiveProperty - 让你的数据动起来&#xff01;-CSDN博客 响应式编程入门教程第二节&#xff1a;构建 ObservableProperty&#xff1c;T&#xff1e; — 封装 ReactiveProperty 的高级用法-CSDN博客 今天我们来聊聊…

单片机:STM32F103的开发环境搭建

本文将详细介绍如何搭建STM32F103的开发环境。STM32F103是STMicroelectronics推出的一款基于ARM Cortex-M3内核的32位微控制器&#xff08;MCU&#xff09;&#xff0c;广泛应用于嵌入式开发。以下是搭建开发环境的详细步骤&#xff0c;涵盖硬件准备、软件安装、工具链配置及简…

eNSP中实现vlan间路由通信(路由器)

eNSP中实现vlan间路由通信&#xff08;路由器&#xff09; 拓扑图PC配置 pc1&#xff1a;192.168.10.1255.255.255.0192.168.10.254pc2&#xff1a;192.168.20.1255.255.255.0192.168.20.254pc3&#xff1a; 192.168.10.2255.255.255.0192.168.10.254pc4:192.168.20.2255.255.2…

spring6合集——spring概述以及OCP、DIP、IOC原则

spring6合集——Spring6核心知识点总结启示录一、SOLID原则1. 单一职责原则&#xff08;SRP&#xff09;2. 开闭原则&#xff08;OCP&#xff09;3. 里氏替换原则&#xff08;LSP&#xff09;4. 接口隔离原则&#xff08;ISP&#xff09;5. 依赖倒置原则&#xff08;DIP&#x…

Stata如何做机器学习?——SHAP解释框架下的足球运动员价值驱动因素识别:基于H2O集成学习模型

SHAP解释框架下的足球运动员价值驱动因素识别——基于H2O集成学习模型⚽ 欢迎关注 「阿水实证通」&#xff0c;前沿方法时刻看&#xff01;&#x1f31f;&#x1f31f;&#x1f31f; 文章目录 SHAP解释框架下的足球运动员价值驱动因素识别——基于H2O集成学习模型⚽聚焦&…

基于Android的益智游戏学习系统

博主介绍&#xff1a;java高级开发&#xff0c;从事互联网行业多年&#xff0c;熟悉各种主流语言&#xff0c;精通java、python、php、爬虫、web开发&#xff0c;已经做了多年的毕业设计程序开发&#xff0c;开发过上千套毕业设计程序&#xff0c;没有什么华丽的语言&#xff0…

Oracle11G Linux版本(linux_x86_64_oracle11.2.0.4)

Oracle11G Linux版本 linux_x86_64_oracle11.2.0.4 文件分割成 七个 压缩包&#xff0c;必须集齐 七个 文件后才能一起解压一起使用&#xff1a; p13390677_112040_Linux-x86-64_7of7.zip下载地址&#xff1a; https://download.csdn.net/download/weixin_43800734/20303421 p1…

C++20中的counting_semaphore的应用

一、std::counting_semaphore 在前面介绍过C20中的同步库&#xff0c;其中就提到过std::counting_semaphore。但当时的重点是同步库的整体介绍&#xff0c;本文则会对std::counting_semaphore这个信号量进行一个全面的分析和说明&#xff0c;并有针对性的给出具体的例程。 C20中…

mongo常用命令

1 连接mongo服务器 mongo ip:端口/库名 -u 用户名 -p 密码 2 选择数据库 show dbs; 显示数据库列表 use 数据库名称; 3 集合操作 &#xff08;1&#xff09; 显示集合列表 show tables; &#xff08;2&#xff09;删除集合 db.集合名称.drop(); &#xff08;3&#x…

华为云 银河麒麟 vscode远程连接

解决方案 检查 SSH 服务器配置&#xff1a; 在远程主机上编辑 /etc/ssh/sshd_config 文件 关键配置说明&#xff1a; AllowTcpForwarding yes # 允许TCP端口转发&#xff08;必须开启&#xff09; AllowAgentForwarding yes # 允许SSH代理转发&#xff08;可选&#xf…

有限状态机(Finite State Machine)

文章目录有限状态机&#xff08;Finite State Machine&#xff09;简介状态机的组成六要素(1) 状态集合(2) 初态(3) 终态(4) 输入符号集(5) 输出符号集(6) 状态转移函数状态机的工作四要素(1) 现态(2) 输入(3) 输出(4) 次态FPGA中的状态机模型1. Moore型状态机(1) Moore l型(2)…

前端框架中注释占位与Fragment内容替换的实现与优化

在现代前端开发中&#xff0c;使用注释占位符替换Fragment内容是一种常见的需求&#xff0c;尤其在处理动态内容、模板预加载和组件复用场景中。React和Vue作为当前最主流的前端框架&#xff0c;提供了不同的实现方式和优化策略&#xff0c;但核心目标都是减少不必要的DOM操作&…

uniapp中使用web-worker性能优化的分享

为什么要使用 web-workers原因很简单&#xff0c;将复杂的计算逻辑和耗时逻辑放到线程中运行&#xff0c;避免ui阻塞&#xff0c;防止卡顿问题场景&#xff1a;本次运用于GPS 位置更新接入小程序注意事项&#xff1a;微信小程序中只允许存在一个 worker所以&#xff0c;需要再一…

5118 API智能处理采集数据教程

简数采集器支持调用5118 API接口处理采集的数据标题和内容、关键词、描述等&#xff0c;还可配合简数采集的SEO功能优化文章数据&#xff0c;对提高收录有积极的作用。 简数采集器支持5118接口&#xff1a;5118智能核心词提取API 和 5118智能摘要提取API 。 接入使用教程 1. …

【深度学习:进阶篇】--4.2.词嵌入和NLP

在RNN中词使用one_hot表示的问题 假设有10000个词 每个词的向量长度都为10000&#xff0c;整体大小太大 没能表示出词与词之间的关系 例如Apple与Orange会更近一些&#xff0c;Man与Woman会近一些&#xff0c;取任意两个向量计算内积都为0 目录 1.词嵌入 1.1.特点 1.3.wor…

WebRTC 的 ICE candidate 协商

文章目录 前言WebRTC 的 ICE candidate 协商1. 什么是 ICE candidate&#xff1f;2. ICE 协商的流程3.前端使用 ICE candidate 协商代码示例1&#xff09;收集 candidate 并发送2&#xff09;WebSocket 接收 candidate 并添加 4. ICE candidate 的类型5. ICE 协商常见问题6. 关…