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

news2024/11/29 22:36:58

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

文章目录

  • 一、类的封装的多文件实现回顾
  • 二、文件操作
    • 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.coloradmin.cn/o/1348435.html

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

相关文章

【STM32F103】SysTick系统定时器延时函数

SysTick SysTick是Cortex-M3内核中的一个外设&#xff0c;内嵌在NVIC中&#xff0c;叫系统定时器。 当处理器在调试期间被喊停时&#xff0c;SysTick也将暂停运作。 一共有四个寄存器&#xff0c;不过我们通常用前三个&#xff0c;不需要校准。下图出自《STM32F10xxx Cortex…

小兔鲜儿 uniapp - SKU 模块

目录 存货单位&#xff08;SKU&#xff09;​ 插件市场​ 下载 SKU 插件​ 使用 SKU 插件​ 插件类型问题​ 核心业务​ 渲染商品规格​ 打开弹窗交互​ 渲染被选中的值​ 存货单位&#xff08;SKU&#xff09;​ SKU 概念 存货单位&#xff08;Stock Keeping Unit&a…

【教学类-43-11】 20231231 3*3宫格数独提取单元格坐标数字的通用模板(做成2*2=4套、3*2=6套)

背景需求&#xff1a; 1、以前做单元格填充&#xff0c;都是制作N个分开的单元格 &#xff08;表格8&#xff09; 2、这次做五宫格数独的Word模板&#xff0c;我图方便&#xff0c;就只用了一个大表格&#xff0c;第六行第六列隐藏框线&#xff0c;看上去就是分开的&#xff…

Linux | 解决问题Ubuntu重启无法进入系统以及网络无法连接【图文详解】

Ubuntu18.04重启无法进入系统&#xff0c;重开后如图 一直在加载系统内核4.15.0-213-generic,无法加载 错误原因 原本的系统是Ubuntu16.04,使用命令升级到Ubuntu18.04版本&#xff0c;升级重启后&#xff0c;远程无法连接&#xff01; 错误解决 第一步&#xff1a;进入GRUB…

ZigBee案例笔记 - 无线点灯

文章目录 无线点灯实验概述工程关键字工程文件夹介绍Basic RF软件设计框图简单说明工程操作Basic RF启动流程Basic RF发送流程Basic RF接收流程 无线点灯案例无线点灯现象 无线点灯实验概述 ZigBee无线点灯实验&#xff08;即Basic RF工程&#xff09;&#xff0c;由TI公司提供…

neovim调试linux内核过程中索引不到对应头文件问题

大家好&#xff0c;我叫徐锦桐&#xff0c;个人博客地址为www.xujintong.com&#xff0c;github地址为https://github.com/jintongxu。平时记录一下学习计算机过程中获取的知识&#xff0c;还有日常折腾的经验&#xff0c;欢迎大家访问。 一、环境 neovim–0.9.4 mason的clang…

中小微医院机构云服务(云HIS)平台源码

云HIS&#xff08;Cloud-Based Healthcare Information System&#xff09;重新定义了HIS&#xff0c;目标是为中小型医疗卫生机构提供优质经济的医疗卫生信息化产品及服务&#xff1b;是以健康档案为主线、以电子病历为核心、以云计算技术为基础的医疗卫生系统。云HIS作为基于…

GoogleNetv1:Going deeper with convolutions更深的卷积神经网络

文章目录 GoogleNetv1全文翻译论文结构摘要1 引言2 相关工作3 动机和高层考虑稀疏矩阵 4 结构细节引入1x1卷积核可以减少通道数 5 GoogleNet6 训练方法7 ILSVRC 2014 分类挑战赛设置和结果8 ILSVRC 2014检测挑战赛设置和结果9 总结 论文研究背景、成果及意义论文图表 GoogleNet…

【小沐学Python】Python实现免费天气预报获取(OpenWeatherMap)

文章目录 1、简介1.1 工具简介1.2 费用1.3 注册1.4 申请key 2、接口说明2.1 One Call 3.02.2 Current Weather and Forecasts collection2.2.1 API 调用2.2.2 API 参数 2.3 Historical Weather collection2.4 Weather Maps collection2.5 Other weather APIs 3、接口测试3.1 例…

无监督学习(下)

1.高斯混合模型(GMM) (1)简单概念 高斯混合模型是一种概率模型&#xff0c;它假定实例是由多个参数未知的高斯分布的混合生成的。从单个高斯分布生成的所有实例都形成一个集群&#xff0c;通常看起来像一个椭圆。每个集群都可以由不同的椭圆形状&#xff0c;大小&#xff0c;密…

【C# 技术】 C# 常用排序方式——自定义数据排序

C# 常用排序方式——自定义数据排序 前言 在最近的项目中经常会对C#中的数据进行排序&#xff0c;对于基本数据类型&#xff0c;其排序方式比较简单&#xff0c;只需要调用内置算法即可实现&#xff0c;但对于自定义数据类型以及自定义排序规则的情况实现起来就比较麻烦&…

美团到店终端从标准化到数字化的演进之路

总第580篇 | 2023年第032篇 本文整理自美团技术沙龙第76期《大前端研发协同效能提升与实践》。前端团队在产研多角色协同形式上存在不同阶段&#xff0c;而大前端多技术栈在各阶段都有其独特的实践&#xff0c;同时又有类似的演进路线。本文从到店终端团队移动端和前端技术栈持…

最详细GIT学习笔记

1. Git简介 1.1. Git介绍 Git(读音为/gɪt/) 是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。 Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件。 1.2. 主流的版本控制器 Git(分布式…

金融帝国实验室(Capitalism Lab)官方正版游戏『2024新年特卖优惠』

「金融帝国实验室」&#xff08;Capitalism Lab&#xff09;Enlight 官方正版游戏「2024新年特卖」 ■优惠时限&#xff1a;2024.01.01&#xff5e;01.31 ■游戏开发商&#xff1a;Enlight Software Ltd. 请您认准以下官方正版游戏购买链接&#xff1a;支持“支付宝&am…

【数据结构-单链表】(C语言版本)

今天分享的是数据结构有关单链表的操作和实践&#xff08;图解法&#xff0c;图变化更利于理解&#xff09; 记录宗旨&#x1f4dd;&#xff1a; 眼&#xff08;脑&#xff09;过千遍&#xff0c;不如手过一遍。 我们都知道单链表是一种常见的链表数据结构&#xff0c;由一系列…

【Delphi】IOS上架踩坑记 - 2024年第一天

目录 一、前言&#xff1a; 二、IOS程序上架网址 三、踩坑记 1. 关于版本中的 CFBundleIdentifier 参数&#xff08;Transporter 提示&#xff09; 2. IOS APP 程序图标要求&#xff08;Transporter 提示&#xff09; 3. 关于版本中的 CFBundleShortVersionString 参数&a…

小波理论与应用:理解小波

1 简介 来自源的信号通常处于时域。例如正弦信号、生物医学信号等。任何时域信号都可以使用数学变换进行处理或变换到频域&#xff08;谱域&#xff09;。傅里叶变换是一种流行或著名的变换&#xff0c;它将时域信号转换为频域信号&#xff0c;而不失一般性。 在绘制时域信号…

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

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

m系列mac配置Tomcat

配置上走了些弯路 翻了不少博客各有各的说法&#xff0c;此说明是本人亲自尝试&#xff0c;电脑是m芯片mbp如果不是mac系统&#xff0c;勿跟风尝试 一、下载和安装Tomcat 1.下载 首先&#xff0c;打开Tomcat官网&#xff1a;https://tomcat.apache.org&#xff0c;选择Downlo…

oracle 9i10g编程艺术-读书笔记1

根据书中提供的下载代码链接地址&#xff0c;从github上找到源代码下载地址。 https://github.com/apress下载好代码后&#xff0c;开始一段新的旅行。 设置 SQL*Plus 的 AUTOTRACE 设置 SQL*Plus 的 AUTOTRACE AUTOTRACE 是 SQL*Plus 中一个工具&#xff0c;可以显示所执行…