網(wǎng)站首頁 編程語言 正文
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();
}
運(yùn)行的結(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;
}
原文鏈接:https://blog.csdn.net/BlackCarDriver/article/details/103690469
相關(guān)推薦
- 2022-01-31 微信小程序獲取二維碼中URL中帶的參數(shù)
- 2022-07-02 css文字顯示兩行,溢出顯示省略號,點(diǎn)擊查看更多
- 2023-08-28 vscode里面報:‘xxx‘ is assigned a value but never used
- 2022-03-30 Android中圖片占用內(nèi)存的深入分析_Android
- 2023-12-26 Description:Web server failed to start. Port 8080
- 2022-03-22 C語言寫一個散列表_C 語言
- 2023-04-18 C++超詳細(xì)分析優(yōu)化排序算法之堆排序_C 語言
- 2023-11-26 (有效解決)Android Studio 運(yùn)行項目時報 Package install error:
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支