c++如何保存vector到文件

 更新时间:2022年11月11日 10:03:57   作者:BlackCarDriver  
这篇文章主要介绍了c++如何保存vector到文件,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

c++保存vector到文件

实现将vector中的数据保存到二进制文件和从文件中读取数据并还原vector并不难,关键是要把握好一些小细节背后的原理,以及确定好存储的格式。

确定格式跟网络通信中的通信协议非常相似,只用存取双方都依照协议行事,才能完成完整步骤。

以下代码提供例子,仅供参考

#include<iostream>
#include<stdio.h>
#include<vector>
#include<string>
#include<string.h>
#include<fstream>
using namespace std;

const int vertif = 0x1234abcd;		//vertif放在文件的开头和结尾用于简单判断是否正确读取数据 
string filePath = "D:/TEMP/DATA";		

struct Unit{
	int idx;
	char str[10];
};


//将vector保存到二进制文件 
int saveData(){
	//创建测试数据 
	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); 	//注意若存放的是指针类型则需要动态申请内存再pushback() 
	}
	//将vector保存到文件,格式:4字节检验码+4字节数组长度+4字节数据长度+可变长度的数据+4字节尾部检验码
	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;
} 

//从二进制中读取之前保存的数据并还原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();
}

运行的结果:

c++读文件,将内容分成两个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;
//字符串分割函数
vector<string> split(string str, string pattern)
{
    string::size_type pos;
    vector<string> result;
    str += pattern;//扩展字符串以方便操作
    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;
        }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • c++ 随机数问题的相关研究

    c++ 随机数问题的相关研究

    这篇文章主要介绍了c++ 随机数问题的相关研究,帮助大家更好的理解和学习使用c++,感兴趣的朋友可以了解下
    2021-03-03
  • 利用C语言实现经典游戏斗兽棋

    利用C语言实现经典游戏斗兽棋

    《斗兽棋》是一款棋类游戏,整个游戏画面是分为两块区域,中间有河流分割两块区域,有桥梁可以让彼此的动物过河,要取得胜利,必须占领那一边动物的巢穴获胜利。本文将用C语言实现这一游戏,需要的可以参考一下
    2022-03-03
  • epoll多路复用的一个实例程序(C实现)

    epoll多路复用的一个实例程序(C实现)

    这篇文章主要为大家详细介绍了epoll多路复用的一个实例程序,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • C语言编程C++自定义个性化类型

    C语言编程C++自定义个性化类型

    这篇文章主要介绍了C语言编程中如何来自定义C++个性化类型,文中附含详细的示例代码,有需要的朋友可以借鉴参考下,希望能够有所帮助
    2021-09-09
  • C++如何实现简易扫雷游戏

    C++如何实现简易扫雷游戏

    这篇文章主要为大家详细介绍了C++如何实现简易扫雷游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • 详解C语言中函数宏的三种封装方式

    详解C语言中函数宏的三种封装方式

    函数宏,即包含多条语句的宏定义,其通常为某一被频繁调用的功能的语句封装,且不想通过函数方式封装来降低额外的弹栈压栈开销。本文就来聊聊函数宏的三种封装方式吧
    2023-03-03
  • C++ 函数重载背后的原理

    C++ 函数重载背后的原理

    这篇文章主要介绍了C++ 函数重载背后的原理,我们不仅仅需要学会重载的使用,更要了解C++为什么支持函数重载,下面我们一起进入文章学习该内容吧
    2022-05-05
  • visual studio code 编译运行html css js文件的教程

    visual studio code 编译运行html css js文件的教程

    这篇文章主要介绍了visual studio code 如何编译运行html css js文件,本文通过图文实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • VS2019实现C++的第一个MFC程序

    VS2019实现C++的第一个MFC程序

    本文主要介绍了VS2019实现C++的第一个MFC程序,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-06-06
  • C++非递归遍历磁盘文件和递归遍历磁盘文件的程序示例

    C++非递归遍历磁盘文件和递归遍历磁盘文件的程序示例

    这篇文章主要介绍了C++非递归遍历磁盘文件和递归遍历磁盘文件的程序示例,大家可以参考使用二种方法
    2013-11-11

最新评论