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.mzph.cn/bicheng/73889.shtml

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

相关文章

RBA+minibatch的尝试

目录 还是咬着牙来写 RBA了 JAX JAX->TORCH torch tensor的变形 pytorch怎么把一个【3,3,5】的tensor变成【3,10,5】&#xff0c;多的用0填充 pytorch如何把shape【100】转成【100,1】 把torch shape【100,1】变成【100】 SQUEEZE grad_fn 不能两次反向传播 还…

基于Python+Django的二手房信息管理系统

项目介绍 PythonDjango二手房信息管理系统(Pycharm Django Vue Mysql) 平台采用B/S结构&#xff0c;后端采用主流的Python语言进行开发&#xff0c;前端采用主流的Vue.js进行开发。 整个平台包括前台和后台两个部分。 - 前台功能包括&#xff1a;首页、二手房信息、公告管理、…

爬虫基础之爬取猫眼Top100 可视化

网站: TOP100榜 - 猫眼电影 - 一网打尽好电影 本次案例所需用到的模块 requests (发送HTTP请求) pandas(数据处理和分析 保存数据) parsel(解析HTML数据) pyecharts(数据可视化图表) pymysql(连接和操作MySQL数据库) lxml(数据解析模块) 确定爬取的内容: 电影名称 电影主演…

解决Qt信号在构造函数中失效的问题

情景引入&#xff1a;音乐播放器的“幽灵列表”问题 假设你正在开发一个音乐播放器应用&#xff0c;其中有一个功能是用户首次打开应用时&#xff0c;需要从服务器拉取最新的歌曲列表并显示在“本地音乐”页面中。你可能会写出类似这样的代码&#xff1a; // LocalSong 类的构…

Hadoop 启动,发现 namenode、secondary namenodes,这两个没有启动,报错超时。

今天在启动 hadoop 的时候&#xff0c;发现本应该同时启动的 namenode、secondary namenodes 却都没有启动。我还以为是坏了又重新装了虚拟机&#xff0c;重新下载 Hadoop 重新配置结果还是同样的问题&#xff0c;那没办法只能去解决问题了。 首先先再次尝试启动看他报错是什么…

Ranger 鉴权

Apache Ranger 是一个用来在 Hadoop 平台上进行监控&#xff0c;启用服务&#xff0c;以及全方位数据安全访问管理的安全框架。 使用 ranger 后&#xff0c;会通过在 Ranger 侧配置权限代替在 Doris 中执行 Grant 语句授权。 Ranger 的安装和配置见下文&#xff1a;安装和配置 …

Sqlserver安全篇之_启用和禁用Named Pipes的案列介绍

https://learn.microsoft.com/zh-cn/sql/tools/configuration-manager/named-pipes-properties?viewsql-server-ver16 https://learn.microsoft.com/zh-cn/sql/tools/configuration-manager/client-protocols-named-pipes-properties-protocol-tab?viewsql-server-ver16 默认…

深入解析过滤器模式(Filter Pattern):一种灵活高效的设计模式

过滤器模式&#xff08;Filter Pattern&#xff09;&#xff0c;也被称为标准模式&#xff0c;是一种常见的结构型设计模式。它通过将对象分为不同的标准或条件&#xff0c;使得对对象集合的操作变得更加灵活和高效。特别适用于处理复杂查询和条件过滤的场景。过滤器模式不仅能…

Spring Boot 整合 Elasticsearch 实践:从入门到上手

引言 Elasticsearch 是一个开源的分布式搜索引擎&#xff0c;广泛用于日志分析、搜索引擎、数据分析等场景。本文将带你通过一步步的教程&#xff0c;在 Spring Boot 项目中整合 Elasticsearch&#xff0c;轻松实现数据存储与查询。 1. 创建 Spring Boot 项目 首先&#xff…

2025年Postman的五大替代工具

虽然Postman是一个广泛使用的API测试工具&#xff0c;但许多用户在使用过程中会遇到各种限制和不便。因此&#xff0c;可能需要探索替代解决方案。本文介绍了10款强大的替代工具&#xff0c;它们能够有效替代Postman&#xff0c;成为你API测试工具箱的一部分。 什么是Postman&…

Redis之单线程与多线程

redis 单线程与多线程 Redis是单线程&#xff0c;主要是指Redis的网络IO和键值对读写是由一个线程来完成的&#xff0c;Redis在处理客户端的请求时包含获取(socket读)、解析、执行、内容返回&#xff08;socket写&#xff09;等都由一个顺序串行的主线程处理&#xff0c;这就是…

C#的简单工厂模式、工厂方法模式、抽象工厂模式

工厂模式是一种创建型设计模式&#xff0c;主要将对象的创建和使用分离&#xff0c;使得系统更加灵活和可维护。常见的工厂模式有简单工厂模式、工厂方法模式和抽象工厂模式&#xff0c;以下是 C# 实现的三个案例&#xff1a; 简单工厂模式 简单工厂模式通过一个工厂类来创建…

python基础8 单元测试

通过前面的7个章节&#xff0c;作者学习了python的各项基础知识&#xff0c;也学习了python的编译和执行。但在实际环境上&#xff0c;我们需要验证我们的代码功能符合我们的设计预期&#xff0c;所以需要结合python的单元测试类&#xff0c;编写单元测试代码。 Python有一个内…

算法刷题力扣

先把大写的字母变成小写的&#xff0c;用大写字母32即可变为小写字母。 写循环跳过字符。 然后判断是否相等即可。具体代码如下&#xff1a; class Solution { public: bool isPalindrome(string s) { int sizes.size(); int begin0; int ends.size()-1; for(int i0;i<s…

allure下载安装及配置

这里写目录标题 一、JDK下载安装及配置二、allure下载三、allure安装四、allure环境变量配置五、allure验证是否安装成功 一、JDK下载安装及配置 allure 是一个java测试报告框架。所以要基于JDK环境。 JDK下载与安装及配置&#xff1a;https://blog.csdn.net/qq_24741027/arti…

linux之 内存管理(1)-armv8 内核启动页表建立过程

一、内核启动时&#xff0c;页表映射有哪些&#xff1f; Linux初始化过程&#xff0c;会依次建立如下页表映射&#xff1a; 1.恒等映射&#xff1a;页表基地址idmap_pg_dir; 2.粗粒度内核镜像映射&#xff1a;页表基地址init_pg_dir; 3.fixmap映射&#xff1a;页表基地址为…

【面试问题】Java 接口与抽象类的区别

引言 在 Java 面向对象编程中&#xff0c;接口&#xff08;Interface&#xff09;和抽象类&#xff08;Abstract Class&#xff09;是两个重要的抽象工具。它们都能定义未实现的方法&#xff0c;但设计目标和使用场景截然不同。本文将通过语法、特性和实际案例&#xff0c;深入…

【资料分享】全志科技T113-i全国产(1.2GHz双核A7 RISC-V)工业核心板规格书

核心板简介 创龙科技SOM-TLT113 是一款基于全志科技T113-i 双核ARM Cortex-A7 玄铁C906 RISC-V HiFi4 DSP 异构多核处理器设计的全国产工业核心板&#xff0c;ARM Cortex-A7 处理单元主频高达1.2GHz。核心板 CPU、ROM、RAM、电源、晶振等所有元器件均采用国产工业级方案&…

R语言高效数据处理-自定义格式EXCEL数据输出

注&#xff1a;以下代码均为实际数据处理中的笔记摘录&#xff0c;所以很零散&#xff0c; 将就看吧&#xff0c;这一篇只是代表着我还在&#xff0c;所以可能用处不大&#xff0c;这一段时间都很煎熬&#xff01; 在实际数据处理中为了提升效率&#xff0c;将Excel报表交付给…

LeetCode 30 —— 30.串联所有单词的子串

题目&#xff1a; 给定一个字符串 s 和一些长度相同的单词 words。找出 s 中恰好可以由 words 中所有单词串联形成的子串的起始位置。 注意子串要与 words 中的单词完全匹配&#xff0c;中间不能有其他字符&#xff0c;但不需要考虑 words 中单词串联的顺序。 示例 1&#xff…