目录

一、文件 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
英文地址,请注明出处:http://en.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. 关…