C++的面向对象学习(9):文件操作

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 一、类的封装的多文件实现回顾
  • 二、文件操作
    • 1.对文件进行操作需要头文件<fstream>
    • 2.操作文件的三大类方法:读、写、读写
  • 三、实现文本文件的读、写、读写
    • 1.读操作
    • 2.写操作
  • 四、读写二进制文件
    • 1.读取二进制文件
    • 2.写入二进制文件
  • 五、常用的文件操作成员函数


一、类的封装的多文件实现回顾

假设我们有一个名为Person的类,它包含一个私有成员变量name和一个公共成员函数setName()和getName(),用于设置和获取name的值。我们将在Person.h文件中声明这个类,然后在Person.cpp文件中实现它。
重点:.h文件声明函数和变量。.c在类的作用域下实现函数定义

Person.h:

#ifndef PERSON_H
#define PERSON_H#include <string>class Person {
public:void setName(const string& name);std::string getName() const;private:std::string name;
};#endif

Person.cpp:

#include "Person.h"void Person::setName(const string& name) {this->name = name;
}string Person::getName() const {return name;
}

在上面的代码中,我们在Person.h文件中声明了Person类,并在Person.cpp文件中实现了它。注意,我们使用了头文件保护来防止多次包含同一个头文件。

现在,我们可以在另一个文件中使用Person类,只需要包含Person.h头文件即可。

main.cpp:

#include <iostream>
#include "Person.h"int main() {Person person;person.setName("Tom");std::cout << "Name: " << person.getName() << std::endl;return 0;
}

在上面的代码中,我们包含了Person.h头文件,并创建了一个Person对象。然后,我们使用setName()函数设置name的值,并使用getName()函数获取它的值。

二、文件操作

程序运行时产生的数据是临时数据,我们想让数据持久化,就可以通过文件来实现。

1.对文件进行操作需要头文件

文件两种类型:
1.文本文件:ASCII码的形式存储
2.二进制文件:二进制形式存储,打开文件无法直接读懂

2.操作文件的三大类方法:读、写、读写

这里涉及到三个类:
读文件是指从文件中读取数据。可以使用ifstream类来读取文件。
写文件是指向文件中写入数据。可以使用ofstream类来写入文件。
读写文件是指同时读取和写入文件。可以使用fstream类来读写文件。

三、实现文本文件的读、写、读写

1.读操作

步骤如下:

①引入头文件:

#include <fstream>

②实例化一个ifstream类的对象

ifstream ifs;
ifs.open("文件路径", 打开方式);

③读数据:

#include <iostream>
#include <fstream>
#include <string>int main() {ifstream rfile;rfile.open("example.txt");if (rfile.is_open()) {string line;while (getline(rfile, line)) {cout << line << endl;}rfile.close();}else {cout << "Unable to open file" << endl;}return 0;
}

使用ifstream类打开了一个名为example.txt的文件,并使用getline()函数逐行读取文件内容。如果文件打开成功,我们将逐行输出文件内容,否则输出错误消息。

2.写操作

步骤如下:

①引入头文件:

#include <fstream>

②实例化一个ofstream类的对象并打开指定的文件

ofstream ofs;
ofs.open("文件路径", 打开方式);

③往文件里面写数据:

ofs<<"要写入的数据";

④关闭文件

ofs.close();

全例:

#include <iostream>
#include <fstream>
using namespace std;int main() {ofstream wfile;wfile.open("example.txt",ios::out);if (wfile.is_open()) {wfile << "Hello, world!" << endl;wfile <<"666" endl;wfile.close();}else {cout << "Unable to open file" << endl;}return 0;
}

运行后,会在vs的同级目录下生成一个文件夹,并把写入的内容显示出来。
在这里插入图片描述

四、读写二进制文件

在C++中,可以使用fstream类来读写二进制文件。fstream类是一个通用的文件流类,可以用于读写文本文件、二进制文件等。

1.读取二进制文件

要读取二进制文件,可以使用ifstream类,它是fstream类的派生类,专门用于读取文件。以下是一个简单的读取二进制文件的示例:

#include <iostream>
#include <fstream>int main() {ifstream file("example.bin", ios::binary);if (file.is_open()) {char buffer[100];file.read(buffer, sizeof(buffer));file.close();}else {cout << "Unable to open file" << endl;}return 0;
}

在上面的代码中,我们使用ifstream类打开了一个名为example.bin的二进制文件,并使用read()函数读取文件内容到一个字符数组中。如果文件打开成功,我们将读取文件内容,否则输出错误消息。

2.写入二进制文件

要写入二进制文件,我们可以使用ofstream类,它也是fstream类的派生类,专门用于写入文件。以下是一个简单的写入二进制文件的示例:

#include <iostream>
#include <fstream>int main() {ofstream file("example.bin", ios::binary);if (file.is_open()) {char buffer[] = "Hello, world!";file.write(buffer, sizeof(buffer) - 1);file.close();}else {cout << "Unable to open file" << endl;}return 0;
}

在上面的代码中,我们使用ofstream类打开了一个名为example.bin的二进制文件,并使用write()函数将数据写入文件中。如果文件打开成功,我们将写入一段数据,否则输出错误消息。

五、常用的文件操作成员函数

在C++中,文件操作的fstream类提供了一些常用的成员函数,用于读写文件。以下是一些常用的成员函数:

open():打开文件。

void open(const char* filename, ios_base::openmode mode);

filename是要打开的文件名,mode是打开文件的模式,可以是ios::in(读取模式)、ios::out(写入模式)、ios::app(追加模式)、ios::binary(二进制模式)等。

close():关闭文件。
void close();

关闭当前打开的文件。

is_open():检查文件是否打开。
bool is_open();

返回一个布尔值,表示文件是否打开。

read():从文件中读取数据。
istream& read(char* buffer, streamsize count);

buffer是存储读取数据的缓冲区,count是要读取的字节数。该函数会从文件中读取指定字节数的数据,并将其存储到缓冲区中。

write():向文件中写入数据。
ostream& write(const char* buffer, streamsize count);

buffer是要写入的数据的缓冲区,count是要写入的字节数。该函数会将指定字节数的数据从缓冲区写入到文件中。

seekg():设置读取位置。
istream& seekg(streampos pos);
istream& seekg(streamoff offset, ios_base::seekdir dir);

pos是要设置的绝对位置,offset是要设置的相对位置的偏移量,dir是相对位置的方向(ios::beg表示从文件开头计算,ios::cur表示从当前位置计算,ios::end表示从文件末尾计算)。

seekp():设置写入位置。
ostream& seekp(streampos pos);
ostream& seekp(streamoff offset, ios_base::seekdir dir);

pos是要设置的绝对位置,offset是要设置的相对位置的偏移量,dir是相对位置的方向(ios::beg表示从文件开头计算,ios::cur表示从当前位置计算,ios::end表示从文件末尾计算)。

tellg():获取读取位置。
streampos tellg();

返回当前的读取位置。

tellp():获取写入位置。
streampos tellp();

返回当前的写入位置。

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

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

相关文章

《2023年企业IoT和OT威胁报告》:物联网恶意软件攻击增长400%

内容概括&#xff1a; 物联网&#xff08;IoT&#xff09;设备无疑改变了我们生活、工作和管理运营技术&#xff08;OT&#xff09;环境的方式。总体而言&#xff0c;到2027年&#xff0c;全球物联网设备数量预计将超过290亿&#xff0c;比2023年的167亿大幅增加。设备和智能技…

SiteGround 注册无法接收短信验证码问题的解决方法

在购买SiteGround后&#xff0c;有时会出现需要进行账号验证的情况&#xff0c;要求通过短信或电话完成验证。然而&#xff0c;有些用户无论如何操作都无法收到短信验证码。以下是解决这个问题并成功完成服务器购买的方法。 Thank You for Your Purchase! Lets Verify Your Ord…

虚拟专线网络(IP-VPN)

虚拟专线网络(IP-VPN)&#xff0c;因为它的安全性和可靠性。通过亚洲领先的 IP VPN 提供商。享受更高的可管理性和可扩展性&#xff0c;在多个站点之间交付 IP 流量或数据包&#xff0c;拥有亚太地区最大的 IP 骨干网。 1&#xff0c;保证正常运行时间&#xff0c;在网络链路发…

C++数据结构-栈

目录 栈顺序栈链栈 栈 栈是允许在表的一端进行插入和删除的线性表。表中允许插入删除的一端是栈顶&#xff0c;栈顶的当前位置是动态变化的&#xff1b;不允许插入和删除的一端是栈底&#xff0c;栈底的位置是不变的。当表中没有元素时称为空栈&#xff0c;插入数据的运算称为…

字符串与模拟法

加密英文 输入一个字符串可用getline(cin,数组名) 字典序 在字符串中寻找子字符串 分糖果 代码 猴子选大王 代码 如果n号猴子被选中&#xff0c;则使得n号的猴子变成false&#xff0c;未出局的猴子为true。 if(pn1) p1;这个是将超出的下标重新变回1号&#xff0c;使其重新循…

PromQL语法

PromQL&#xff08;Prometheus Query Language&#xff09;是 Prometheus 内置的数据查询语言&#xff0c;它能实现对事件序列数据的查询、聚合、逻辑运算等。它被广泛应用在 Prometheus 的日常应用当中&#xff0c;包括对数据查询、可视化、告警处理当中。简单地说&#xff0c…

易趋产品升级(EasyTrack 11_V1.3) | 集成飞书、WPS、个性化设置,增强团队协作和用户体验

企业在项目管理过程中&#xff0c;经常会遇到项目信息同步不及时、沟通障碍以及管理软件使用不便捷等难题&#xff0c;导致团队协作效率低下。这种情况下&#xff0c;如果使用了多个办公软件&#xff08;如&#xff1a;钉钉、企业微信、项目管理软件等&#xff09;&#xff0c;…

35--JDK新特性

1、新语法结构 新的语法结构&#xff0c;为我们勾勒出了 Java 语法进化的一个趋势&#xff0c;将开发者从复杂、繁琐的低层次抽象中逐渐解放出来&#xff0c;以更高层次、更优雅的抽象&#xff0c;既降低代码量&#xff0c;又避免意外编程错误的出现&#xff0c;进而提高代码质…

【VB测绘程序设计】案例6——华氏温度与摄氏温度之间的转换程序(附源代码)

【VB测绘程序设计】案例6——华氏温度与摄氏温度之间的转换程序(附源代码) 文章目录 前言一、界面显示二、程序说明三、程序代码1程序变换2程序变换四、数据演示总结前言 本文主要掌握Val()函数以及String数据类型的应用,通过2个text来输入数据,2个Command控件来执行转换…

Java——功能开发思路

目录 前言一、准备工作—准备各类文件1、准备实体类、枚举类、常量类2、准备配置文件 二、先编写Controller三、再编写Service、serviceImpl四、再编写mapper后续敬请期待 前言 Java开发功能简单思路 一、准备工作—准备各类文件 提前知道需要用到哪些类可以提前准备好&#…

智能客服系统要素分析:提升客户满意度与工作效率的关键要素

智能客服系统是企业建立完善服务框架的重要工具。市面上存在着形态各异的各种客服系统&#xff0c;如何选择一款最适合自己企业的产品是很多采购人员想知道的问题。事实上&#xff0c;不同的智能客服系统之间的主要功能并未存在太大的区别&#xff0c;它们往往会在一些亮点功能…

09 标准库软件模拟I2C时序

引言&#xff1a; 你需要的I2C知识这里都有&#xff0c; 本文涵盖了I2C的基本知识和在各个主流平台的开发实例&#xff0c; 总之&#xff0c; 你需要的&#xff0c;都在这里&#xff0c; 后续我也会继续更新在嵌入式开发中常见的通信协议。 一、I2C的基本知识 1. I2C介绍 IIC总…

留言板(Mybatis连接数据库版)

目录 1.添加Mybatis和SQL的依赖 2.建立数据库和需要的表 3.对应表中的字段&#xff0c;补充Java对象 4.对代码进行逻辑分层 5.后端逻辑代码 之前的项目实例【基于Spring MVC的前后端交互案例及应用分层的实现】https://blog.csdn.net/weixin_67793092/article/details/134…

HTTPS协议详解

目录 前言 一、HTTPS协议 1、加密是什么 2、为什么要加密 二、常见加密方式 1、对称加密 2、非对称加密 三、数据摘要与数据指纹 1、数据摘要 2、数据指纹 四、HTTPS加密策略探究 1、只使用对称加密 2、只使用非对称加密 3、双方都使用非对称加密 4、对称加密非…

html-css-js使用axios和ajax获取接口并携带请求头+获取输入框或选择器内容

需求&#xff1a;使用axios或者Ajax获取接口&#xff0c;有些需要获取到输入框&#xff0c;或者选择器内容之后传给接口&#xff0c;也就是写了几种不同请求的方法&#xff0c;网上有很多方法&#xff0c;本文章算是个归纳吧。 一、axios请求传参请求头 1.github下载axios 我…

MS2358:96KHz、24bit 音频 ADC

产品简述 MS2358 是带有采样速率 8kHz-96kHz 的立体声音频模数 转换器&#xff0c;适合于面向消费者的专业音频系统。 MS2358 通过使用增强型双位 Δ - ∑ 技术来实现其高精度 的特点。 MS2358 支持单端的模拟输入&#xff0c;所以不需要外部器 件&#xff0c;非常适…

领域驱动设计(Domain-Driven Design DDD)——模型驱动设计的构造块2

书接上回领域驱动设计&#xff08;Domain-Driven Design DDD)——模型驱动设计的构造块1-CSDN博客 四、领域对象的生命周期 每个对象都有生命周期&#xff0c;管理这些对象面临诸多挑战&#xff0c;主要的挑战有以下两类。 在整个生命周期中维护完整性 防止模型陷入管理…

内侧APP分发平台:移动应用开发的加速器

在数字化时代&#xff0c;移动应用已成为企业触达用户的重要渠道。为了迅速占领市场&#xff0c;开发者需要一种能够快速发布和测试移动应用的解决方案。内侧APP分发平台应运而生&#xff0c;它通过简化应用的封装、测试和分发流程&#xff0c;极大地提升了移动应用的上市速度。…

【大数据面试知识点】Spark中的累加器

Spark累加器 累加器用来把Executor端变量信息聚合到Driver端&#xff0c;在driver程序中定义的变量&#xff0c;在Executor端的每个task都会得到这个变量的一份新的副本&#xff0c;每个task更新这些副本的值后&#xff0c;传回driver端进行merge。 累加器一般是放在行动算子…

12. 整数转罗马数字

罗马数字包含以下七种字符&#xff1a; I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 …