C++实现对象序列化和反序列化(读写二进制文件)操作
相關(guān)函數(shù)介紹
在我們的C語言中讀寫二進(jìn)制文件一般使用的fread、fwrite全局函數(shù),當(dāng)然也可以使用更底層的read和write函數(shù)。在我們的C++中 通過ofstream 和 ifstream 對(duì)象 讀寫文件更加的方便了。對(duì)二進(jìn)制文件的讀寫 主要使用?ofstream::write,ifstream::read函數(shù)。如果對(duì)文件讀寫方向感不強(qiáng),記不住的 ,記住4個(gè)字就行了。讀入寫出。這個(gè)4個(gè)字是針對(duì) 程序或者說是內(nèi)存!往內(nèi)存里面讀數(shù)據(jù) -> read ,往磁盤里面寫數(shù)據(jù)->write。這樣永遠(yuǎn)就會(huì)忘了。還有一些其他的函數(shù),都比較簡單。感覺用起來很方便。
這里普及下序列化和反序列化。
序列化: 將數(shù)據(jù)結(jié)構(gòu)或?qū)ο筠D(zhuǎn)換成二進(jìn)制串的過程。
反序列化:將在序列化過程中所生成的二進(jìn)制串轉(zhuǎn)換成數(shù)據(jù)結(jié)構(gòu)或者對(duì)象的過程。
下面就用相關(guān)函數(shù)實(shí)現(xiàn)普通的字符文件操作 和 二進(jìn)制文件操作。代碼注釋很詳細(xì)
普通文件操作
#define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <fstream> using namespace std;//寫文件 void WriteFile() {ofstream file("./text.txt",ios::out);if (!file.is_open()){cout << "文件打開失敗" << endl;return;}file << "姓名:laymond" << endl;file << "年齡:18" << endl;file.close();return; } //讀文件 void ReadFile() {ifstream file("./text.txt", ios::in);if (!file.is_open()){cout << "文件打開失敗" << endl;return;}char temp[1024] = { 0 };//讀取文件3種方式//1、read file.eof() 作為判斷條件 會(huì)慢一拍while (file >> temp)//while (!file.eof()){//file.read(temp, 1024); //這樣會(huì)讀取到\n//cout << temp// >>按行讀取,不會(huì)讀換行符cout << temp << endl;}//2、get 一個(gè)一個(gè)字符的讀取//char c;//while ( (c=file.get()) != EOF )//{// cout << c;//}//3、一行一樣讀取 getline 會(huì)把\n 舍棄掉....//while (file.getline(temp,1024))//{// cout << temp << endl;//}file.close(); }?
二進(jìn)制文件操作(序列化和反序列化)
?
接上面代碼哈,是寫在同一個(gè)文件中的。
class Person { public:Person(char* name, int age){strcpy(this->name, name);this->age = age;}void showInfo(){cout << name << " " << age << endl;} public:char name[10]{ 0 };int age = 0; }; //二進(jìn)制文件 進(jìn)行寫 void WriteBinaryFile() {ofstream file("./binary.txt",ios::out | ios::binary );if (!file.is_open()){cout << "文件打開失敗" << endl;}Person p1("Lay1", 11);Person p2("Lay2", 2);Person p3("Lay3", 151);Person p4("Lay4", 5);Person p5("Lay5", 9);file.write((char*)&p1, sizeof(p1));file.write((char*)&p2, sizeof(p2));file.write((char*)&p3, sizeof(p3));file.write((char*)&p4, sizeof(p4));file.write((char*)&p5, sizeof(p5));file.close(); } //二進(jìn)制文件 進(jìn)行讀 void ReadBinaryFile() {ifstream file("./binary.txt", ios::in | ios::binary);if (!file.is_open()){cout << "文件打開失敗" << endl;}//開辟一塊空間 存放讀取的數(shù)據(jù)char* temp = new char[sizeof(Person)];//或者 Person p;開辟的空間肯定合適//將數(shù)據(jù)讀入的 temp對(duì)應(yīng)的空間while (file.read(temp,sizeof(Person))){Person p = *(Person*)(temp);p.showInfo();}file.close(); }int main(int argc, char *argv[]) {//讀寫 字符文件//WriteFile();//ReadFile();//讀寫 二進(jìn)制文件//WriteBinaryFile();ReadBinaryFile();return EXIT_SUCCESS; }運(yùn)行結(jié)果驗(yàn)證
新人創(chuàng)作打卡挑戰(zhàn)賽發(fā)博客就能抽獎(jiǎng)!定制產(chǎn)品紅包拿不停!總結(jié)
以上是生活随笔為你收集整理的C++实现对象序列化和反序列化(读写二进制文件)操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Red Hat Enterprise L
- 下一篇: C/C++:Windows编程—代码实现