C++数据文件存储与加载(利用opencv)【附免opencv方法】

首先请先确认已经安装好了opencv3及以上版本。
安装方法参见另一篇文章

#include 
#include 
#include 
using namespace cv;
using namespace std;

存储

then

int main()
{
//创造一些要存的数据先
	string words = "hello, my guys!";
	float n = 3.1415926;
	Mat m = Mat::eye(3, 3, CV_32F);
	//开始创建存储器
	FileStorage save("data.yml", FileStorage::WRITE);// 你也可以使用xml格式
	save << "words" << words;
	save << "number" << n;
	save << "matrix" << m;
	save.release();
	//存储完毕
	cout << "finish storing" << endl;

加载

//加载数据,类似Python字典的用法,创建加载器
	FileStorage load("data.yml", FileStorage::READ);
	
	float nn;
	Mat mm;
	string ww;
	load["words"] >> ww;
	load["number"] >> nn;
	load["matrix"] >> mm;
	cout<< ww << endl << nn << endl << mm;
	cout << endl << "That's the end";
	load.release();
	
	return 0;
}

完整代码

#include 
#include 
#include 

using namespace cv;
using namespace std;

int main()
{
    string words = "hello, my guys!";
    float n = 3.1415926;
    Mat m = Mat::eye(3, 3, CV_32F);
    FileStorage save("data.yml", FileStorage::WRITE);
    save << "words" << words;
    save << "number" << n;
    save << "matrix" << m;
    save.release();
    cout << "finish storing" << endl;

    FileStorage load("data.yml", FileStorage::READ);

    float nn;
    Mat mm;
    string ww;
    load["words"] >> ww;
    load["number"] >> nn;
    load["matrix"] >> mm;
    cout<< ww << endl << nn << endl << mm;
    cout << endl << "That's the end";
    load.release();

    return 0;
}

演示结果
C++数据文件存储与加载(利用opencv)【附免opencv方法】_第1张图片

无OpenCV版本

opencv的安装毕竟也是耗时耗力,如果只是小事情没必要那么做,而且也不是大多数人都是图像处理工作者。
因此一个朴素版本的保存与加载就很重要。数据建议通过字典(相当于c++中的map图)存储。
至于map的存储于加载如下。有了这个基础,大家可自行构造属于自己的c++存储、加载器。

#include 
#include 
#include 
#include 
using namespace std;
/*
*update是覆盖更新模式存储,会影响原来的内容。(默认模式)
*new是新建文件模式。
*append模式是在原文件中补充内容。
*/
template<typename T1, typename T2>
void saveMap(map<T1, T2> m, string path, string mode="update") {
	ofstream outer;
	mode == "new" ? outer.open(path, ios::out | ios::trunc) : mode == "append" ? outer.open(path, ios::out | ios::app) : outer.open(path, ios::out);
	for (auto& i : m) outer << i.first << " => " << i.second << endl;
	outer.close();
}
template<typename T1, typename T2>
void loadMap(map<T1, T2> &m, string path) {
	ifstream reader;
	reader.open(path, ios::in);
	T1 key;
	T2 val;
	string tmp;
	while (reader.good()) {
		reader >> key >> tmp >> val;
		m.insert(pair<T1, T2>(key, val));
	}
	reader.close();
}
auto displayMap=[](map < string, int>m) {for (auto& i : m) cout << i.first << ":" << i.second << endl;};
int main() {
	string path="./test1.dat";//.xls(x) .doc(x) .txt .bin .xml .mat .dat .iso .rar...等大多数主流格式都可以顺利完成保存加载过程,但在非文本文件中基本上不可打开看。目前我试过.doc(x) 和 .txt是可打开可视的。
	string mode = "new";
	map<string, int> a{ {"zlc",100},{"jia",98},{"yi",90} };
	saveMap(a, path, mode);
	map<string, int> m;
	loadMap(m,path);
	displayMap(m);
}


你可能感兴趣的:(c++)