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.hqwc.cn/news/313785.html

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

相关文章

提取 PE 文件的各种信息

前段时间项目需要实现对 Windows PE 文件版本信息的提取&#xff0c;如文件说明、文件版本、产品名称、版权、原始文件名等信息。获取这些信息在 Windows 下当然有一系列的 API 函数供调用&#xff0c;简单方便。 我们先看一下PE文件结构&#xff0c;PE文件由DOS首部&#xff0…

数据结构期末复习(3)栈和队列

堆栈&#xff08;stack&#xff09; 堆栈&#xff08;stack&#xff09;是一种基于后进先出&#xff08;LIFO&#xff0c;Last In First Out&#xff09;原则的数据结构。它模拟了现实生活中的堆栈&#xff0c;类似于一摞盘子或一堆书。 堆栈有两个基本操作&#xff1a;入栈&a…

【代码解析】代码解析之生成token(1)

本篇文章主要解析上一篇&#xff1a;代码解析之登录&#xff08;1&#xff09;里的第8行代码调用 TokenUtils 类里的genToken 方法 https://blog.csdn.net/m0_67930426/article/details/135327553?spm1001.2014.3001.5501 genToken方法代码如下&#xff1a; public static S…

【UE 截图】 自定义截图路径 文件名

目录 0 引言1 实践 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;UE虚幻引擎专栏&#x1f4a5; 标题&#xff1a;【UE 截图】 自定义截图路径 文件名❣️ 寄语&#xff1a;书到用时方恨少&#xff0c;事非经过不知难&#xff01;&#x1f388; 最…

LanceDB:在对抗数据复杂性战役中,您可信赖的坐骑

LanceDB 建立在 Lance&#xff08;一种开源列式数据格式&#xff09;之上&#xff0c;具有一些有趣的功能&#xff0c;使其对 AI/ML 具有吸引力。例如&#xff0c;LanceDB 支持显式和隐式矢量化&#xff0c;能够处理各种数据类型。LanceDB 与 PyTorch 和 TensorFlow 等领先的 M…

漏洞复现-海康威视网络对讲广播系统远程命令执行漏洞(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

Linux:apache优化(7)—— 访问控制

作用&#xff1a;为apache服务提供的页面设置客户端访问权限&#xff0c;为某个组或者某个用户加密访问&#xff1b; /usr/local/httpd/bin/htpasswd -c /usr/local/httpd/conf/htpasswd tarro1 #添加admin用户&#xff0c;可以在两个路径中间添加-c是新建文件删除原文件&#…

Maya-UE xgen-UE 毛发导入UE流程整理

首先声明&#xff1a;maya建议用2022版本及一下&#xff0c;因为要用到Python 2 ,Maya2023以后默认是Python3不再支持Python2; 第一步&#xff1a;Xgen做好的毛发转成交互式Groom 第二步&#xff1a;导出刚生成的交互式Groom缓存&#xff0c;需要设置一下当前帧&#xff0c;和…

docker Mysql-udf-http

1.Mysql-udf-http镜像已上传到dockerhub中 docker pull heidaodageshiwo/mysql-udf-http:v1 2.启动镜像(默认密码root1234) docker run -tid -p 3306:3306 --namemysql-udf-http --privilegedtrue heidaodageshiwo/mysql-udf-http:v1 3.命令 [rootlocalhost ~]# docker im…

Ultra ISO 虚拟光驱修改光盘盘符

windows xp 环境 ultra iso 虚拟光驱修改光盘盘符 method 1. 在ultra iso 中 [选项]->[配置]->[虚拟光驱]&#xff0c;在新盘符里选指定盘符 ->[修改] method 2. 打开命令行&#xff0c;进入安装目录&#xff0c;如 "C:\Program Files\UltraISO\drivers"&…

【CF比赛记录】—— Good Bye 2023(A、B、C)

&#x1f30f;博客主页&#xff1a;PH_modest的博客主页 &#x1f6a9;当前专栏&#xff1a;CF比赛记录 &#x1f48c;其他专栏&#xff1a; &#x1f534;每日一题 &#x1f7e1; cf闯关练习 &#x1f7e2; C语言跬步积累 &#x1f308;座右铭&#xff1a;广积粮&#xff0c;缓…

2022年全球软件开发大会(QCon上海站)-核心PPT资料下载

一、峰会简介 世界需要更多的软件&#xff0c;但受限于 IT 成本&#xff0c;企业不再盲目扩张 IT 团队&#xff0c;而是转向于从研发效率下手&#xff0c;做出了流程、平台、规范等一系列动作。然而&#xff0c;并不是每个企业和管理者都明白&#xff0c;开发者不是流水线上的…