c++如何保存vector到文件
更新時間:2022年11月11日 10:03:57 作者:BlackCarDriver
這篇文章主要介紹了c++如何保存vector到文件,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
c++保存vector到文件
實現(xiàn)將vector中的數(shù)據(jù)保存到二進(jìn)制文件和從文件中讀取數(shù)據(jù)并還原vector并不難,關(guān)鍵是要把握好一些小細(xì)節(jié)背后的原理,以及確定好存儲的格式。
確定格式跟網(wǎng)絡(luò)通信中的通信協(xié)議非常相似,只用存取雙方都依照協(xié)議行事,才能完成完整步驟。
以下代碼提供例子,僅供參考
#include<iostream> #include<stdio.h> #include<vector> #include<string> #include<string.h> #include<fstream> using namespace std; const int vertif = 0x1234abcd; //vertif放在文件的開頭和結(jié)尾用于簡單判斷是否正確讀取數(shù)據(jù) string filePath = "D:/TEMP/DATA"; struct Unit{ int idx; char str[10]; }; //將vector保存到二進(jìn)制文件 int saveData(){ //創(chuàng)建測試數(shù)據(jù) Unit tmp; vector<Unit>Data; tmp.str[0] = 'a'; for(int i=0; i<10; i++){ tmp.idx = i; tmp.str[0] ++; Data.push_back(tmp); //注意若存放的是指針類型則需要動態(tài)申請內(nèi)存再pushback() } //將vector保存到文件,格式:4字節(jié)檢驗碼+4字節(jié)數(shù)組長度+4字節(jié)數(shù)據(jù)長度+可變長度的數(shù)據(jù)+4字節(jié)尾部檢驗碼 ofstream ofile(filePath.c_str(), ios::binary); if(ofile.is_open()==false){ cout<<"Open file fail!"<<endl; exit(1); } ofile.write((char*)&vertif, sizeof(int)); int length = Data.size(); ofile.write((char*)&length, sizeof(int)); int totalSize = Data.size()*sizeof(Unit); ofile.write((char*)&totalSize, sizeof(int)); ofile.write((char*)&Data[0], totalSize); //注意取址方式,不能用begin() ofile.write((char*)&vertif, sizeof(int)); ofile.close(); return 0; } //從二進(jìn)制中讀取之前保存的數(shù)據(jù)并還原vector int restore(){ ifstream ifile(filePath.c_str(), ios::binary); int tmpVertif, length, totalSize; ifile.read((char*)&tmpVertif, sizeof(int)); if (tmpVertif!=vertif){ cout<<"Unknow format at the begin of file..."; exit(1); } ifile.read((char*)&length, sizeof(int)); ifile.read((char*)&totalSize, sizeof(int)); vector<Unit>Data(length); //需要往文件里面放長度的原因 ifile.read((char*)&Data[0], totalSize); ifile.read((char*)&tmpVertif, sizeof(int)); if (tmpVertif!=vertif){ cout<<"Unknow format at the end of file..."<<endl; exit(1); } for(int i=0; i<Data.size(); i++){ cout<< Data[i].idx <<" "<<Data[i].str[0] <<endl; } return 0; } int main(){ saveData(); restore(); }
運行的結(jié)果:
c++讀文件,將內(nèi)容分成兩個vector
//123.txt ABS 3 Acrylic 4.8 Aluminum 70 Cortical_bone 18 Cancellous_bone 3.7 Carbon_fiber 150 Co_Cr 53.2 Concrete 17 CFRP 17.9 PEEK 3.8 Platinum 147 Silicon_carbide 450 Stainless_steel 51 Titanium 50.2
#include<iostream> #include <fstream> #include <sstream> #include<string> #include <vector> using namespace std; # define MAX 2000 int main() { ifstream in_file("123.txt"); string a; vector<string> s; vector<double> d; while (getline(in_file, a)) { istringstream record(a); string word; vector<string> vs; while (record >> word) vs.push_back(word); string aa; double dd; aa = vs[0]; dd = stod(vs[1]); s.push_back(aa); d.push_back(dd); } for (int i = 0; i < s.size(); i++) cout<<s[i] << " " <<endl; for (int i = 0; i < s.size(); i++) cout << d[i] << endl; return 0; }
#include<iostream> #include <fstream> #include<string> #include <vector> using namespace std; //字符串分割函數(shù) vector<string> split(string str, string pattern) { string::size_type pos; vector<string> result; str += pattern;//擴(kuò)展字符串以方便操作 int size = str.size(); for (int i = 0; i < size; i++) { pos = str.find(pattern, i); if (pos < size) { std::string s = str.substr(i, pos - i); result.push_back(s); i = pos + pattern.size() - 1; } } return result; } int main() { ifstream in_file("123.txt"); string a; vector<string> s; vector<double> d; while (getline(in_file, a)) { vector<string> vs; string pattern = "\t"; string::size_type pos; a = a + pattern; for (int i = 0; i < a.size(); i++) { pos = a.find(pattern, i); if (pos < a.size()) { std::string s = a.substr(i, pos - i); vs.push_back(s); i = pos + pattern.size() - 1; } } string aa; double dd; aa = vs[0]; dd = stod(vs[1]); s.push_back(aa); d.push_back(dd); } for (int i = 0; i < s.size(); i++) cout<<s[i] << " " <<endl; for (int i = 0; i < s.size(); i++) cout << d[i] << endl; return 0; }
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
C語言實現(xiàn)通訊管理系統(tǒng)設(shè)計
這篇文章主要為大家詳細(xì)介紹了C語言實現(xiàn)通訊管理系統(tǒng)設(shè)計,具有一定的參考價值,感興趣的小伙伴們可以參考一下2018-01-01