当前位置: 首页 > news >正文

文件操作(二进制文件)

        C++中对文件操作需要包含头文件  #include<fstream>
文件类型分为两类:


        1. 文本文件:文件以文本对应的 ASCII 码形式存储在计算机中
        2. 二进制文件:文件以文本的二进制形式存储在计算机中,用户一 般不能直接读懂


文件的主要操作:


                1. ofstream :写操作
                2. ifstream :读操作
                3. fstream :读写操作

文件打开方式

        注意:文件打开方式可以配合使用,利用|操作符

        例如:用二进制方式写文件 ios::binary | ios::out

二进制文件

        以二进制的方式对文件进行读写操作。打开方式要指定 ios::binary

        写文件

步骤:

        二进制方式写文件主要利用流对象调用成员函数 write
        函数原型: ostream& write(const char * buffer, int len);
        参数解释: 字符指针 buffer 指向内存中一段存储空间。len 是读写的字节数
        

        实例

#include<iostream>
//1、包含头文件
#include<fstream>using namespace std;//二进制文件-写文件
class Person
{
public:char m_name[64];int m_age;
};void test01()
{//2、3: 创建流对象,打开文件的操作可以在这一步一起完成ofstream ofs("person.txt", ios::out | ios::binary);//4、写文件Person p = {"Tom", 18};ofs.write((const char *)&p, sizeof(Person));//5、关闭文件ofs.close();
}int main()
{test01();return 0;
}
        头文件包含

        #include<fstream>:引入文件输入输出流库,用于文件的读写操作。

        定义person类
class Person
{
public:char m_name[64];int m_age;
};

        公有成员变量:m_name:一个长度为 64 的字符数组,用于存储人的姓名。

        定义test01函数
void test01()
{ofstream ofs("person.txt", ios::out | ios::binary);Person p = {"Tom", 18};ofs.write((const char *)&p, sizeof(Person));ofs.close();
}

        ofstream ofs("person.txt", ios::out | ios::binary); 

        创建一个 ofstream 对象 ofs,用于以输出模式(ios::out二进制模式(ios::binary打开文件 person.txt(第一个带“”中间的参数)如果文件不存在,会创建该文件;如果文件已存在,会清空文件内容。同时这一步也打开了文件。

        Person p = {"Tom", 18};

        创建一个 Person 类的对象 p,并初始化其成员变量 m_name 为 "Tom"m_age 为 18

        ofs.write((const char *)&p, sizeof(Person)); 

        使用 write 函数将对象 p 的二进制数据写入到文件中(const char *)&p 将 p 的地址强制转换为 const char * 类型,sizeof(Person) 表示要写入的数据的字节数。

        ofs.close();

        关闭文件,释放相关资源

        注:介绍一下write函数:

        在 C++ 里,write 函数是 ostream 类(ofstream 是它的派生类)的成员函数,主要用于以二进制形式把数据写入文件

        函数原型

ostream& write (const char* s, streamsize n);

        s:这是一个指向要写入的数据的指针,其类型为 const char*要是要写入的是其他类型的对象,就得把对象的地址强制转换为 const char* 类型

        n:表示要写入的字节数,通常使用 sizeof 运算符来获取对象的大小。

        返回值:返回一个指向调用该函数的 ostream 对象的引用,这就允许进行链式调用。

        读文件

        二进制方式读文件主要利用流对象调用成员函数 read

        函数原型:istream& read(char * buffer, int len);

        参数解释:字符指针 buffer 指向内存中一段存储空间, len 是读写的字节数。

        实例

#include<iostream>
//1、包含头文件
#include<fstream>
using namespace std;
//二进制文件-读文件
class Person
{
public:char m_name[64];int m_age;
};void test01()
{//2、创建流对象,打开文件的操作可以在这一步一起完成ifstream ifs;//3、打开文件,判断文件是否打开成功ifs.open("person.txt", ios::in | ios::binary);if (!ifs.is_open()){cout << "failure" << endl;return;}else{cout << "success" << endl;}//4、读文件Person p;ifs.read((char *)&p, sizeof(Person));cout << "name:" << p.m_name << endl;cout << "age:" << p.m_age << endl;//5、关闭文件ifs.close();
}int main()
{test01();return 0;
}

        #include<fstream>:包含文件输入输出流库,用于文件的读写操作。

        Person 类的定义
class Person
{
public:char m_name[64];int m_age;
};

        定义了一个名为 Person 的类,该类有两个公有成员变量:

  • m_name:一个长度为 64 的字符数组,用于存储人的姓名。
  • m_age:一个整数类型的变量,用于存储人的年龄。
        test01函数
void test01()
{//2、创建流对象,打开文件的操作可以在这一步一起完成ifstream ifs;//3、打开文件,判断文件是否打开成功ifs.open("person.txt", ios::in | ios::binary);if (!ifs.is_open()){cout << "failure" << endl;return;}else{cout << "success" << endl;}//4、读文件Person p;ifs.read((char *)&p, sizeof(Person));cout << "name:" << p.m_name << endl;cout << "age:" << p.m_age << endl;//5、关闭文件ifs.close();
}
         流对象的创建
ifstream ifs;

        创建一个 ifstream 类型的对象 ifsifstream 是用于从文件中读取数据的输入文件流类。

        文件的打开与状态检查
ifs.open("person.txt", ios::in | ios::binary);if (!ifs.is_open())
{cout << "failure" << endl;return;
}
else
{cout << "success" << endl;
}

        ifs.open("person.txt", ios::in | ios::binary);:尝试以二进制输入模式打开名为 person.txt 的文件。ios::in 表示输入模式,ios::binary 表示以二进制方式进行读写。同时,打开文件的操作也在这一步完成。

        ifs.is_open():检查文件是否成功打开。如果文件打开失败,输出 "failure" 并返回;如果打开成功,输出 "success"

        数据的读取与输入
Person p;ifs.read((char *)&p, sizeof(Person));cout << "name:" << p.m_name << endl;
cout << "age:" << p.m_age << endl;

        Person p;:创建一个 Person 类的对象 p,用于存储从文件中读取的数据。

  ifs.read((char *)&p, sizeof(Person));:使用 read 函数从文件中读取数据。(char *)&p 是将 p 对象的地址强制转换为 char* 类型,sizeof(Person) 表示要读取的字节数,即 Person 类对象的大小。

        最后,将读取到的 p 对象的 m_name 和 m_age 成员变量的值输出到控制台。

        注:介绍一下read函数:

        在 C++ 里,read 函数是 istream 类(ifstream 是它的派生类)的成员函数,主要用于以二进制形式从文件里读取数据

        函数原型:

istream& read (char* s, streamsize n);

        s:这是一个指向用于存储读取数据的内存块的指针,类型为 char*。若要读取的数据是其他类型的对象,就得把对象的地址强制转换为 char* 类型

        n:表示要读取的字节数,通常使用 sizeof 运算符来获取对象的大小。

        返回值:返回一个指向调用该函数的 istream 对象的引用,这就允许进行链式调用。

        文件关闭
ifs.close();

        关闭文件,释放相关的系统资源。


文章转载自:

http://IpHZMA48.xrrjb.cn
http://fAX1u9ls.xrrjb.cn
http://4IcnrTyP.xrrjb.cn
http://xc7YXEWJ.xrrjb.cn
http://tEJcjLHM.xrrjb.cn
http://KfWXFKm0.xrrjb.cn
http://sk3WKJUl.xrrjb.cn
http://ILPEXv8i.xrrjb.cn
http://c8KtE3RB.xrrjb.cn
http://ecIdIkq6.xrrjb.cn
http://OaxCSFBP.xrrjb.cn
http://eXvKrDo1.xrrjb.cn
http://wiGhiwAY.xrrjb.cn
http://uyWFSxxL.xrrjb.cn
http://qx0JhDhs.xrrjb.cn
http://9I8LDdx8.xrrjb.cn
http://oGM2MEbr.xrrjb.cn
http://vfEzUDZN.xrrjb.cn
http://6nJWiSB4.xrrjb.cn
http://Nw1g1kxk.xrrjb.cn
http://8Q9Z0Vbd.xrrjb.cn
http://7nYeCJjW.xrrjb.cn
http://0iae1f41.xrrjb.cn
http://grXBa6Tz.xrrjb.cn
http://4RMkk8Sb.xrrjb.cn
http://G9DsUNa3.xrrjb.cn
http://VQwKh1Gi.xrrjb.cn
http://sdMqyUcr.xrrjb.cn
http://VqTzFtiP.xrrjb.cn
http://27fcYeoA.xrrjb.cn
http://www.dtcms.com/a/136668.html

相关文章:

  • Vue el-from的el-form-item v-for循环表单如何校验rules(二)
  • 「Java EE开发指南」用MyEclipse开发EJB 3无状态会话Bean(二)
  • 磁导率;电感为什么存在饱和电流?气隙的定义,磁芯开气隙有哪些作用
  • Redis的IO多路复用
  • Flutter的自动化测试 python flutter编程
  • 从IF到SWITCH:解锁Power BI条件判断的应用场景
  • 第五阶段:项目实践与后续学习指引
  • 【Axure绘制原型】小图标使用技巧
  • Spring boot 知识整理
  • 利用耦合有限元和神经网络计算的骨重塑模拟多尺度方法
  • 【java】记录一个开启事务抛出异常的场景
  • 【sqlserver】修改nvarchar类型为varchar脚本
  • 神经光子渲染:物理级真实感图像生成——从麦克斯韦方程到深度学习
  • C# 西门子通信
  • 敦普水性低温烤漆的进击
  • NO.94十六届蓝桥杯备战|图论基础-单源最短路|常规dijkstra|堆优化dijkstra|bellman-ford|spfa(C++)
  • JavaSE学习(前端初体验)
  • 界面控件DevExpress WPF v25.1新功能预览 - 文档处理类功能升级
  • Linux 软件管理
  • 简单实现单点登录
  • rust编程学习(二):复合数据类型
  • 【正点原子STM32MP257连载】第四章 ATK-DLMP257B功能测试——板载蓝牙测试 #RTL8733BU
  • 计算方法在单细胞数据分析中的应用及AI拓展
  • Flutter项目之设置页
  • 基于PyTorch实现的Diffusion模型:从MNIST图像中学习生成能力
  • MyBatis 如何使用
  • Navicat导入JSON数据到MySQL表
  • 安卓环境搭建开发工具下载Gradle下载
  • git在分支上会退到某个指定的commit
  • 在边缘端进行tensorflow模型的部署(小白初探)