日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無先后,達(dá)者為師

網(wǎng)站首頁 編程語言 正文

c++如何保存vector到文件_C 語言

作者:BlackCarDriver ? 更新時間: 2022-12-10 編程語言

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

欄目分類
最近更新