文件操作(二进制文件)

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_age18

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

使用 write 函数将对象 p 的二进制数据写入到文件中(const char *)&pp 的地址强制转换为 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 类型的对象 ifsifstream 是用于从文件中读取数据的输入文件流类。

文件的打开与状态检查
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_namem_age 成员变量的值输出到控制台。

注:介绍一下read函数:

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

函数原型:

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

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

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

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

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

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

相关推荐
泡泡_02241 分钟前
密码学--RSA
c++·密码学
1白天的黑夜127 分钟前
动态规划-62.不同路径-力扣(LeetCode)
c++·算法·leetcode·动态规划
海尔辛30 分钟前
学习黑客光猫-路由器-交换机
网络·学习·智能路由器
矢鱼35 分钟前
单调栈模版型题目(3)
java·开发语言
少了一只鹅38 分钟前
深入理解指针(3)
c语言·数据结构·算法
仙人掌_lz41 分钟前
从零开始理解FlashAttention:算法细节图解
人工智能·python·深度学习·算法·ai·flashattention
n33(NK)42 分钟前
Java中的内部类详解
java·开发语言
为美好的生活献上中指44 分钟前
java每日精进 5.07【框架之数据权限】
java·开发语言·mysql·spring·spring cloud·数据权限
5649831 小时前
逆向工程学习记录:反汇编反编译
学习
罗迪尼亚的熔岩1 小时前
C# 的异步任务中, 如何暂停, 继续,停止任务
开发语言·c#