文本中读取数据,将文本读入内存生成字符串然后将字符串解析成结构化数据。
结构数据存入文本,将结构数据序列化成字符串,然后将字符串存入文本。
字符串的读写,可以用c++的通用的 iostream 标准的流读入读出工具就可以。
至于字符串的解析和序列化,会有多种选择,最基本的用c/c++ 字符串分析工具,比如string自带的成员函数,当然也可以用其他比较流行的库比如 xml、json、protobuf 。等
最近要用到json解析文件,作为总结写了一个读写json文件的例子。采用的库位json11,需要c++11支持。json11的下载地址: https://github.com/dropbox/json11 。
使用时只需将json11.hpp 和 json11.cpp 添加到工程目录下。
具体json11.hpp定义的数据结构可以参考另外一篇博客:https://blog.csdn.net/fengbingchun/article/details/51396932
下面贴出了具体的从文本读取json数据,并且将json数据存如文本的过程。
#include <iostream>
#include "json11.hpp"
#include <vector>
#include <string.h>
#include <fstream>
using namespace std;
//单个车位包含的信息
class SlotInf
{
public:
int park_id; //车位编号 >0 为有效车位
float loc_points[8]; //存储车辆坐标系下的车位顶点坐标[x1,y1,x2,y3,....]
int img_points[8]; //图像从坐标系下车位顶点坐标
int datalen; //字段长度
public:
SlotInf(int park_id_, json11::Json::array locpoints, json11::Json::array imgpoint)
{
datalen=8;
memset(loc_points,0,sizeof(loc_points));
memset(img_points,0,sizeof(img_points));
//读入park_id_
park_id = park_id_;
if (park_id_ == 0)
{
return ;
}
//读入车辆坐标系顶点坐标
int nsize = locpoints.size();
if (nsize != datalen)
{
park_id=0;
return ;
}
nsize = imgpoint.size();
if (nsize != datalen)
{
park_id=0;
return ;
}
for(int i=0; i<nsize; i++)
{
loc_points[i] = locpoints[i].number_value();
img_points[i] = imgpoint[i].number_value();
//cout<<loc_points[i]<<" "<<img_points[i]<<endl;
}
}
~SlotInf()
{
//delete[] loc_points;
//delete[] img_points;
}
};
bool readJson(string file_dir, vector<SlotInf> &slotVect)
{
//文件中读取数据流并存储到string中
std::filebuf in;
if(!in.open(file_dir.c_str(),std::ios::in))
{
cout<<"fail to open file!"<<endl;
return false;
}
std::istream iss(&in);
std::istreambuf_iterator<char> eos;
string s(std::istreambuf_iterator<char>(iss),eos); //将数据流填充到s变量中
string err;
in.close();
//从string中解析文件结构
//json11::Json json = json11::Json::parse(s, err);
auto json = json11::Json::parse(s, err);
if(!err.empty())
{
return false;
}
slotVect.clear();
std::string json_str = json.dump(); //将json文件顺序写入string中
json11::Json::array array1 = json.array_items(); //数据结构的最外层是队列,每个元素对应一个车位的信息
for (int i =0; i<array1.size(); i++)
{
json11::Json::object tmp = array1[i].object_items();
SlotInf slotinf(tmp["park_id"].int_value(),tmp["loc_points"].array_items(),tmp["img_point"].array_items());
slotVect.push_back(slotinf);
//获取车位id
/* int park_id = tmp["park_id"].int_value();
cout<<park_id<<endl;
//获取车位坐标
json11::Json::array locpoints = tmp["loc_points"].array_items();
vector<float> loc_pointsvect;
for (int j =0; j<locpoints.size(); j++)
{
loc_pointsvect.push_back(locpoints[j].number_value());
}
//获取图像坐标
json11::Json::array imgpoint = tmp["img_point"].array_items();
vector<int> img_pointvect;
for(int j =0; j<imgpoint.size(); j++)
{
img_pointvect.push_back(imgpoint[j].number_value());
}
*/
}
return true;
}
//将读取的json文件重新存储为.json 文件
bool writjson(string savedir, vector<SlotInf> slotVect)
{
//序列化数据
int nsize =slotVect.size();
json11::Json::array slots; //存放车辆信息的数组
for(int i=0; i<nsize; i++)
{//读取每个车位的信息
json11::Json::array loc_points;
json11::Json::array img_points;
for(int j=0; j<slotVect[i].datalen; j++)
{
loc_points.push_back(slotVect[i].loc_points[j]);
img_points.push_back(slotVect[i].img_points[j]);
}
json11::Json tmp_json = json11::Json::object{
{"park_id",slotVect[i].park_id},
{"loc_points",loc_points},
{"img_points",img_points}
};
slots.push_back(tmp_json);
}
string json_str = json11::Json(slots).dump();
//保存到文本
ofstream oswirte(savedir);
oswirte<<json_str<<endl;
oswirte.close();
return true;
}
int main() {
vector<SlotInf> slotVect;
readJson("/home/CLionProjects/jsonrw/2.json", slotVect);
writjson("/home/CLionProjects/jsonrw/3.json", slotVect);
return 0;
}
json文本的内容:
[{"park_id": 1, "loc_points": [10.124499486113775, -3.3475110446685226, 7.334836432931803, -3.224959302712459, 7.099517093580167, -8.581567509259186, 9.88918014676214, -8.70411925121525], "img_point": [723, 431, 846, 490, 1340, 493, 1152, 447]}, {"park_id": 0, "loc_points": [], "img_point": []}, {"park_id": 0, "loc_points": [], "img_point": []}, {"park_id": 0, "loc_points": [], "img_point": []}, {"park_id": 0, "loc_points": [], "img_point": []}, {"park_id": 0, "loc_points": [], "img_point": []}, {"park_id": 0, "loc_points": [], "img_point": []}, {"park_id": 0, "loc_points": [], "img_point": []}, {"park_id": 0, "loc_points": [], "img_point": []}, {"park_id": 0, "loc_points": [], "img_point": []}]
参考博客:https://blog.csdn.net/fengbingchun/article/details/51396932
https://blog.csdn.net/zhouzhenhe2008/article/details/77840731