概要
二进制读写不仅可以对普通数据类型进行读写,也能对自定义数据类型进行读写,同时对自定义数据类型的读写容易导致读写崩溃或数据不全问题。
技术细节
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[]的字符数组形式。