概要
二进制读写不仅可以对普通数据类型进行读写,也能对自定义数据类型进行读写,同时对自定义数据类型的读写容易导致读写崩溃或数据不全问题。
技术细节
1、二进制写文件
ofstream ofs; //创建流对象
ofs.open(“文件路径”, 打开方式); //打开文件并判断文件是否打开成功
ofs.write(const char *buffer, int len); //写数据,len表示buffer总字节数
ofs.close() //关闭文件
class Person
{
public:
Person(const char name[], int age)
{
strcpy_s(this->name, name);
this->age = age;
}
char name[30]; //字符串不能用char*或者string类型存放
int age;
};
int main()
{
//创建流对象并打开文件
ofstream ofs("D:\\test.txt", ios::binary|ios::out);
//判断文件是否打开成功
if (!ofs.is_open())
{
cout << "文件打开失败!" << endl;
return 0;
}
//写数据
Person p("张三", 20);
ofs.write((const char*)&p, sizeof(Person)); //强转const char*
//关闭文件
ofs.close();
}
2、二进制读文件
read(char *buffer, int len) //len为buffer总字节数
class Person
{
public:
char name[30]; //字符串不能用char*或者string类型存放
int age;
};
int main()
{
//创建流对象并打开文件
ifstream ifs("D:\\test.txt", ios::binary|ios::in);
//判断文件是否打开成功
if (!ifs.is_open())
{
cout << "文件打开失败!" << endl;
return 0;
}
//读数据
Person p;
ifs.read((char*)&p, sizeof(Person));
cout << p.name << " " << p.age << endl; //张三,20
//关闭文件
ifs.close();
}
小结
二进制读写成员变量的字符串为啥不设为string或char *类型,拿char 举例,char 指向一个字符串地址,假设这个字符串内容占10个字节,写到文本后内容是占10个字节的,在读取的时候sizeof(Person)不是10个字节,而是四个字节(指针占四个字节),这样的话10个字节的内容就读不全,那输出char内容可能就是乱码或者错误的结果。string类仅有一个数据成员,char指针,故string类的大小和指针相似,所以最好采取char name[]的字符数组形式。
本文讨论了如何在二进制模式下使用ofstream和ifstream对自定义数据类型如Person进行读写,指出使用char数组存储字符串的原因,避免因内存占用和数据完整性问题导致的错误。
2万+

被折叠的 条评论
为什么被折叠?



