C++学习笔记(二十一)——文件读写

一、文件读写

作用:
文件读写指的是将数据从程序存储到文件,或从文件读取数据,以实现数据的持久化存储
C++ 提供了 fstream 头文件,用于文件操作,主要包括:

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

应用场景:

  • 配置文件(保存程序设置)
  • 日志系统(记录程序运行状态)
  • 数据存储(存储用户数据、序列化对象)

二、C++ 文件操作库

头文件#include <fstream>

(1)主要类:

作用
ofstream写文件
ifstream读文件
fstream读写文件

(2)文件打开模式(open()mode 参数)

模式作用
ios::in只读方式打开文件(文件必须存在)
ios::out写入方式打开文件(文件不存在会创建,存在则清空)
ios::app追加方式打开文件(数据追加到文件末尾)
ios::binary二进制模式打开文件
ios::ate打开文件并移动到文件末尾
ios::trunc清空文件内容(默认行为)

(3)文件读写方法

操作方法
写入文件ofstream<<write()
读取文件ifstream>>getline()read()
读写文件fstream<<>>seekg()
文本文件ifstream/ofstream逐行读写
二进制文件ifstream/ofstream + ios::binarywrite()read()

注意:

  • 文本文件: getline() 逐行读取;
  • 二进制文件: read()/write() 提高性能;
  • fstream 用于同时读写,避免频繁打开关闭文件。

(4)文件状态检查函数

文件状态检查函数,返回值是一个布尔值

函数名作用
good()文件流是否处于正常状态,没有遇到任何错误或异常
fail()是否发生格式错误或输入/输出操作失败(但不包括 badbit)
eof()是否读取操作到达文件末尾
bad()是否发生了严重错误,如磁盘损坏、系统错误等

三、写入文件(ofstream

示例1——向文件写入数据

#include <iostream>
using namespace std;
#include <fstream>int main() {ofstream outFile("test.txt");  // 创建并打开文件if (!outFile){cout << "文件打开失败!" << endl;return -1;}outFile << "Hello, C++ 文件操作!" << endl;outFile << "写入第二行数据" << endl;outFile.close();  // 关闭文件cout << "数据已写入 test.txt" << endl;system("pause");return 0;
}

注意:

  • ofstream outFile("test.txt"):创建/打开 test.txt,默认清空文件
  • outFile << "内容"向文件写入数据
  • outFile.close()关闭文件,释放资源。

示例2——追加模式写入文件

#include <iostream>
using namespace std;
#include <fstream>int main() {ofstream outFile("test.txt", ios::app);  // 追加模式outFile << "追加数据 1" << endl;outFile << "追加数据 2" << endl;outFile.close();system("pause");return 0;
}

注意:

  • ios::app 追加模式,不会清空文件,而是在末尾追加数据

四、 读取文件(ifstream

示例1——逐行读取文件

#include <iostream>
using namespace std;
#include <fstream>
#include <string>int main() {ifstream inFile("test.txt");  // 打开文件if (!inFile){cout << "文件打开失败!" << endl;return -1;}string line;while (getline(inFile, line)) // 逐行读取{cout << line << endl;}inFile.close(); // 关闭文件system("pause");return 0;
}

注意:

  • getline(inFile, line) 逐行读取文件内容,存入 line 变量。

示例2——逐个字符读取文件

#include <iostream>
using namespace std;
#include <fstream>int main() {ifstream inFile("test.txt"); // 打开文件if (!inFile){cout << "文件打开失败!" << endl;return -1;}char ch;while (inFile.get(ch)) // 逐个字符读取{cout << ch;}inFile.close(); // 关闭文件system("pause");return 0;
}

注意:

  • 适用于逐个字符解析文件,如读取二进制文件处理格式化文本

五、读写文件(fstream

示例——同时读写文件

#include <iostream>
using namespace std;
#include <fstream>
#include <string>int main() {fstream file("data.txt", ios::in | ios::out | ios::app);  // 读写+追加if (!file){cout << "文件打开失败!" << endl;return -1;}file << "新数据写入" << endl;file.seekg(0);  // 移动到文件开头string line;while (getline(file, line)){cout << line << endl;}file.close(); // 关闭文件system("pause");return 0;
}

注意:

  • fstream 同时支持读写ios::in | ios::out 使得文件可读可写。
  • seekg(0)读指针移到文件开头,确保读取最新内容。

六、特殊用法

(1)处理二进制文件

示例1——写入二进制文件

#include <iostream>
using namespace std;
#include <fstream>struct Person 
{char name[20];int age;
};int main() {ofstream outFile("person.dat", ios::binary); // 创建并打开二进制文件Person p1 = { "Alice", 25};outFile.write(reinterpret_cast<char*>(&p1), sizeof(p1));  // 写入二进制数据outFile.close(); // 关闭文件system("pause");return 0;
}

注意:

  • ios::binary 以二进制模式打开文件
  • write(reinterpret_cast<char*>(&p1), sizeof(p1)) 将结构体写入文件

示例2——读取二进制文件

#include <iostream>
using namespace std;
#include <fstream>struct Person
{char name[20];int age;
};int main() {ifstream inFile("person.dat", ios::binary); // 打开二进制文件Person p;inFile.read(reinterpret_cast<char*>(&p), sizeof(p));  // 读取二进制数据cout << "姓名: " << p.name << ", 年龄: " << p.age << endl;inFile.close(); // 关闭文件system("pause");return 0;
}

注意:

  • 适用于存储复杂数据结构(如 struct)。
  • 文件大小更小,读取速度更快

(2) 检查文件流的状态

作用:
good() 是 C++ 中std::ifstreamstd::ofstreamstd::fstream文件流类提供的成员函数之一。它可以检查文件流的状态,判断是否处于“良好”状态,即文件流没有遇到任何错误或异常情况。

示例:

#include <iostream>
using namespace std;
#include <fstream>int main()
{ifstream file("test.txt");if (file.good()){cout << "文件可以正常读取!" << std::endl;}else{cout << "文件不可读!可能不存在或发生了错误!" << std::endl;}file.close(); // 关闭文件system("pause");return 0;
}

(3) 获取文件大小

作用:

  • tellg() 是 C++ 中 std::ifstream(输入文件流)的成员函数,用于获取当前文件读取位置的指针(文件指针),即读取操作即将在文件中的哪个字节位置执行
  • tellg() 常与 seekg() 结合使用,以计算文件大小

示例:

#include <iostream>
using namespace std;
#include <fstream>struct Person
{char name[20];int age;
};int main()
{ofstream outFile("person.dat", ios::binary); // 创建并打开二进制文件Person p1 = { "Alice", 25 };outFile.write(reinterpret_cast<char*>(&p1), sizeof(p1));  // 写入二进制数据outFile.close(); // 关闭文件ifstream file("person.dat", ios::binary); // 打开二进制文件file.seekg(0, ios::end);  // 将指针移动到文件末尾streampos fileSize = file.tellg();  // 获取当前位置,即文件大小cout << "文件大小: " << fileSize << " 字节" << std::endl;file.close();system("pause");return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/36654.html

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

相关文章

【开原宝藏】30天学会CSS - DAY1 第一课

下面提供一个由浅入深、按步骤拆解的示例教程&#xff0c;让你能从零开始&#xff0c;逐步理解并实现带有旋转及悬停动画的社交图标效果。为了更简单明了&#xff0c;以下示例仅创建四个图标&#xff08;Facebook、Twitter、Google、LinkedIn&#xff09;&#xff0c;并在每一步…

【pytest框架源码分析五】pytest插件的注册流程

前文介绍到pytest整体是运用插件来实现其运行流程的。这里仔细介绍下具体过程。 首先进入main方法 def main(args: list[str] | os.PathLike[str] | None None,plugins: Sequence[str | _PluggyPlugin] | None None, ) -> int | ExitCode:"""Perform an i…

谷歌or-tools开源库入门

1.命令行编译程序 这里要说明下&#xff0c;直接用qt或者VS2022打开cmake工程&#xff0c;编译没有成功。所以&#xff0c;老老实实的按照官方教程来&#xff0c;使用命令行编译。 &#xff08;1&#xff09;准备 1&#xff09;安装cmake&#xff0c;版本3.18以上&#xff0…

Python实现WYY音乐下载

一、需求背景 WYY音乐作为国内主流音乐平台,其歌曲资源丰富但下载接口存在多重加密保护。本文将通过Python结合JS逆向技术,解析其核心加密逻辑,实现免费歌曲的下载功能。 二、技术难点分析 1. 接口加密机制 通过抓包分析可知,网易云核心接口使用两次加密: 第一次:获取…

拥抱健康生活,开启养生之旅

在快节奏的现代生活中&#xff0c;健康养生愈发重要&#xff0c;它不仅能让我们保持良好状态&#xff0c;更是享受美好生活的基石。​ 饮食养生是健康的关键。我们应秉持均衡原则&#xff0c;一日三餐合理搭配。多摄入新鲜蔬果&#xff0c;它们富含维生素、矿物质与膳食纤维&a…

《Waf 火绒终端防护绕过实战:系统程序副本+Certutil木马下载技术详解》

目录 绕过火绒终端安全软件的详细方法 方法一&#xff1a;利用系统程序副本绕过命令监控 方法二&#xff1a;结合certutil.exe副本下载并执行上线木马 注意事项 总结 实际案例解决方案 前提条件 详细操作步骤 1. 攻击主机&#xff08;VPS&#xff09;上的准备工作 2.…

机器学习概要

文章目录 一、什么是机器学习 二、机器学习的种类 1. 有监督学习 2. 无监督学习 3.强化学习 三、机器学习的应用 四、机器学习的步骤 1. 数据的重要性 2. 数据和学习的种类 3. 可视化 一、什么是机器学习 机器学习指的是计算机根据给定的问题、课题或环境进行学习&a…

C# Winform 实现换肤,并自定义皮肤功能

具体实现原理详见 SkinHelp.cs类&#xff0c;实现了对原有控件的重绘&#xff0c;详见源码 public abstract class SkinHelp{private static SkinColor _currentSkinColor SkinColor.Default;private static BackgroundStripe _currentStripe BackgroundStripe.Default;priva…

基于FPGA的3U机箱模拟量高速采样板ADI板卡,应用于轨道交通/电力储能等

板卡简介&#xff1a; 本板为模拟量高速采样板&#xff08;ADI&#xff09;&#xff0c;主要用于电机转速和相电流检测&#xff0c;以实现电机闭环控制。 性能规格&#xff1a; 电源&#xff1a;DC5V&#xff0c;DC3.3V&#xff0c;DC15V&#xff0c;DC24V FPGA&#xff1a;…

python爬虫概述

0x00 python爬虫概述 以豆瓣的选电影模块为例&#xff0c;当查看源代码搜索猫猫的奇幻漂流瓶是搜不到的 这时服务器的工作方式应该是这样的 客户端浏览器第一次访问其实服务器端是返回的一个框架(html代码) 当客户端浏览器第二次通过脚本等方式进行访问时服务器端才返回的数据…

win10 如何用我的笔记本 接网线 远程控制 台式机

1.查看笔记本ip&#xff0c;台式机ip。确保在同一网段 可以ping通 1.1 ip在同一网段&#xff0c;但是ping不通 1.解决&#xff1a;把双方防火墙关闭 2.解决&#xff1a;当前网口&#xff0c;先禁用再启用 以上两台电脑就可以ping通了 2.设置双方电脑 启动远程控制 此电脑-》…

给管理商场消防安全搭建消防安全培训小程序全过程

一、需求沟通 “我是管理商场消防安全的嘛&#xff0c;做这个的作用呢&#xff0c;1是商场的所有商户员工可以看平面或者视频随时自学&#xff0c; 2是我们定期培训必修课程、考试&#xff0c;这个需要留存他们的手签字的签到表确认我们讲给他们听了&#xff08;免责很重要&am…

可视化图解算法:链表中倒数(最后)k个结点

1. 题目 描述 输入一个长度为 n 的链表&#xff0c;设链表中的元素的值为ai &#xff0c;返回该链表中倒数第k个节点。 如果该链表长度小于k&#xff0c;请返回一个长度为 0 的链表。 数据范围&#xff1a;0≤n≤105&#xff0c;0 ≤ai≤109&#xff0c;0 ≤k≤109 要求&am…

Quartz知识点总结

简单说明 简单的定时任务使用Timer或者ScheduledExecutorService quartz支持复杂的定时执行功能。支持ram存储&#xff08;内存存储&#xff09;和持久化存储。quartz有分布式和集群能力 简单使用 获取任务调度器Schedule。任务调度器可以管理任务。创建任务实例。使用JobB…

C语言每日一练——day_12(最后一天)

引言 针对初学者&#xff0c;每日练习几个题&#xff0c;快速上手C语言。第十二天。&#xff08;最后一天&#xff0c;完结散花啦&#xff09; 采用在线OJ的形式 什么是在线OJ&#xff1f; 在线判题系统&#xff08;英语&#xff1a;Online Judge&#xff0c;缩写OJ&#xff0…

【宇宙回响】从Canvas到MySQL:飞机大战的全栈交响曲【附演示视频与源码】

&#x1f31f; 这是星际大战系列的第三篇送福利文章&#xff0c;感谢一路以来支持和关注这个项目的每一位朋友&#xff01; &#x1f4a1; 文章力求严谨&#xff0c;但难免有疏漏之处&#xff0c;欢迎各位朋友指出&#xff0c;让我们一起在交流中进步。 &#x1f381; 项目代码…

数据结构知识点1

目录 一、时间复杂度和空间复杂度 1.1时间复杂度&#xff1a; 1.2空间复杂度&#xff1a; 二、装箱和拆箱 三、泛型 3.1泛型类的使用&#xff1a; 3.2泛型的上界&#xff1a; 3.3泛型方法&#xff1a; 一、时间复杂度和空间复杂度 1.1时间复杂度&#xff1a; 时间复杂…

华为ipd流程华为流程体系管理华为数字化转型流程数字化管理解决方案介绍81页精品PPT

华为流程体系最佳实践主要包括构建完善的流程框架&#xff0c;明确各层级流程要素与职责&#xff0c;梳理涵盖研发、采购、营销、服务、资产管理等多领域的流程&#xff0c;通过梳理业务场景和核心能力搭建差异化流程框架&#xff0c;采用自上而下与自下而上相结合的建模方法&a…

在大数据开发中ETL是指什么?

hello宝子们...我们是艾斯视觉擅长ui设计和前端数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩! 在数字经济时代&#xff0c;数据已成为企业最核心的资产。然而&#xff0c;分散在业务系统、日志文件…

Collection系列集合的小结+集合并发修改异常问题

一、Collection系列集合的小结 二、补充知识&#xff1a;集合的并发修改异常问题 三、Collection的其他相关知识 1. 前置知识&#xff1a;可变参数 2. 集合的工具类&#xff1a;Collections 3. 综合案例&#xff1a;斗地主游戏 &#xff08;1&#xff09;创建Card类 public c…