C++可以读写文本类型的文件,同理也可以读写二进制类型的文件,虽然存储的内容可能无法直接通过双击打开的方式,但通过二进制的方式读取可以正常的展示
#include <iostream>
#include <fstream>
首先引入头文件
然后创建一个类,这个类用来添加数据,然后将数据以二进制的方式添加到文件中
//二进制文件的读写
class Person
{
public:
char m_Name[50];//姓名
int m_Age; //年龄
};
注: 类型请勿使用string ,string对象里包含指针,每次打开程序构造链表时会从二进制文件读取上次保存的信息,那么这个指针也会被读进来,但是这个指针已经失效了,它指向的地址在这次运行时并没有申请,所以析构对象时,去释放它指向的地址是非法的。
然后是将对象存储为二进制的文件
//文件的写入
//创建流对象
ofstream ofs("person.txt", ios::out | ios::binary); //可以在创建对象的同时就指定需要打开的文件与打开的方式,通过传参即可
//打开文件
//ofs.open("test.txt", ios::out | ios::binary);
//写文件
Person p = { "张三" , 18 };
ofs.write((const char*)&p, sizeof(Person));
//关闭流
ofs.close();
参数在上篇文章中已经写过,此处就不再赘述. 传入的参数是一个对象,所以读的时候也可以通过对象的方式来读取,如果直接打开此文件将只能看到乱码.
张三 烫
虽然直接打开是乱码,但通过二进制的方式读取此文件,然后用对象来接收,由于参数类型必须为char指针,所以需要强转,但对象无法强转为指针类型,所以强转的是对象的引用,依然可以正常使用
//文件的读取
ifstream ifs("person.txt", ios::in | ios::binary);
//打开文件
//ifs.open("person.txt", ios::in | ios::binary);
// 判断文件是否能被打开
if (!ifs.is_open())
{
cout << "文件打开失败" << endl;
return;
}
//读取文件
Person p2;
ifs.read((char*)&p2, sizeof(Person));
cout << "p2的姓名为: " << p2.m_Name << "\np2的年龄为: " << p2.m_Age << endl;
//关闭流
ifs.close();
以下文效果
p2的姓名为: 张三
p2的年龄为: 18
E:\C和Cpp的学习\C++学习\Debug\文件-二进制-读写.exe (进程 12700)已退出,代码为 0。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .