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语言实现简单员工工资管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • C++内存管理详解使用方式

    C++内存管理详解使用方式

    内存管理是C++最令人切齿痛恨的问题,也是C++最有争议的问题,C++高手从中获得了更好的性能更大的自由,C++菜鸟的收获则是一遍—遍的检查代码和对C++的痛恨,但内存管理在C++中无处不在,内存泄漏几乎在每个C++程序中都会发生,要想成为C++高手,内存管理这关是必须过的
    2022-04-04
  • 详解C++11中的lambda匿名函数

    详解C++11中的lambda匿名函数

    匿名函数,简单地理解就是没有名称的函数,又常被称为 lambda 函数或者 lambda 表达式,这篇文章主要介绍了C++11中的lambda匿名函数,需要的朋友可以参考下
    2022-11-11
  • c++非变易算法-stl算法

    c++非变易算法-stl算法

    本文主要介绍了C++ STL算法库中的非变易算法,是一些原则上不会变更操作数据的算法,包括:逐个查找算法、元素搜索算法、元素统计算法、序列匹配算法、子序列搜索算法、这些函数均包含于<algorithm>头文件,本文给出的所有代码在VS2010中编译运行通过
    2014-03-03
  • 统计C语言二叉树中叶子结点个数

    统计C语言二叉树中叶子结点个数

    这篇文章主要介绍的是统计C语言二叉树中叶子结点个数,文章以C语言二叉树中叶子结点为基础分享一个简单小栗子讲解,具有一定的知识参考价值,需要的小伙伴可以参考一下
    2022-02-02
  • C++ 的cout格式化输出场景示例详解

    C++ 的cout格式化输出场景示例详解

    这篇文章主要为大家介绍了C++的cout格式化输出场景示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • 关于c语言中输出字符指针的相关问题

    关于c语言中输出字符指针的相关问题

    这篇文章主要介绍了关于c语言中输出字符指针的相关问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-07-07
  • 详解C++ 临时量与临时对象及程序的相关优化

    详解C++ 临时量与临时对象及程序的相关优化

    这篇文章主要介绍了C++ 临时量与临时对象及程序的相关优化,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-04-04
  • C语言 扫雷程序的实现

    C语言 扫雷程序的实现

    这篇文章主要介绍了C语言 扫雷程序的实现的相关资料,需要的朋友可以参考下
    2017-03-03
  • C++实操之内联成员函数介绍

    C++实操之内联成员函数介绍

    大家好,本篇文章主要讲的是C++实操之内联成员函数介绍,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下,方便下次浏览
    2021-12-12

最新评论