C++中对文件操作需要包含头文件 #include<fstream>
文件类型分为两类:
1. 文本文件:文件以文本对应的 ASCII 码形式存储在计算机中
2. 二进制文件:文件以文本的二进制形式存储在计算机中,用户一 般不能直接读懂
文件的主要操作:
1. ofstream :写操作
2. ifstream :读操作
3. fstream :读写操作
文件打开方式
注意:文件打开方式可以配合使用,利用|操作符
例如:用二进制方式写文件 ios::binary | ios::out
二进制文件
以二进制的方式对文件进行读写操作。打开方式要指定 ios::binary
写文件
步骤:
实例
#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
参数解释:字符指针 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
类型的对象 ifs
,ifstream
是用于从文件中读取数据的输入文件流类。
文件的打开与状态检查
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();
关闭文件,释放相关的系统资源。