文件操作(二进制文件)

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 是读写的字节数

实例

cpp 复制代码
#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类
cpp 复制代码
class Person
{
public:
    char m_name[64];
    int m_age;
};

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

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

o**fstream ofs("person.txt", ios::out | ios::binary); :**

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

P**erson p = {"Tom", 18};:**

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

o**fs.write((const char *)&p, sizeof(Person)); :**

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

o**fs.close();:**

关闭文件,释放相关资源。

注:介绍一下write函数:

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

函数原型

cpp 复制代码
ostream& write (const char* s, streamsize n);

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

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

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

读文件

二进制方式读文件主要利用流对象调用成员函数 read
函数原型:istream& read(char * buffer, int len);

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

实例

cpp 复制代码
#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 类的定义
cpp 复制代码
class Person
{
public:
    char m_name[64];
    int m_age;
};

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

  • m_name:一个长度为 64 的字符数组,用于存储人的姓名。
  • m_age:一个整数类型的变量,用于存储人的年龄。
test01函数
cpp 复制代码
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();
}
流对象的创建
cpp 复制代码
ifstream ifs;

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

文件的打开与状态检查
cpp 复制代码
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"。

数据的读取与输入
cpp 复制代码
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 是它的派生类)的成员函数,主要用于以二进制形式从文件里读取数据。

函数原型:

cpp 复制代码
istream& read (char* s, streamsize n);

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

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

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

文件关闭
cpp 复制代码
ifs.close();

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

相关推荐
Pniubi8 小时前
HashMap的扩容和树化边界
java·开发语言
gCode Teacher 格码致知10 小时前
Pandas教学-17:Series与Dataframe的关系
开发语言·python·pandas
发量惊人的中年网工10 小时前
分公司访问总部ERP慢怎么办?SD-WAN组网的排查与验收要点
服务器·开发语言·php
下页、再停留10 小时前
【C#桌面客户端系列学习-15】生成可视化图表之折线图、柱状图、饼状图
开发语言·c#
撩得Android一次心动10 小时前
Jetpack Compose 知识点整理2【个人用】
android·笔记·学习·kotlin·compose
ShineWinsu10 小时前
对于JavaScript:操作元素的解析
开发语言·前端·javascript·面试·web·dom·元素
罗西的思考11 小时前
【Agentic RL】Dressage Staleness 控制深度分析
人工智能·算法·机器学习
quaer11 小时前
弗洛伊德算法--判圈法寻找环的入口O(n) O(1)
数据结构·算法
dadaobusi11 小时前
学习:灵犀指令集
学习
益莱储中国12 小时前
深度解析:RF 实验室从 5G迈向 6G 的过程中保持技术领先与设备升级的路径
开发语言·php