C++重载流运算符,将存储结构体的vector直接写入文件
我们知道,当vector很大的时候,如果使用循环的方式将其中的元素写入文件将非常费时,因此有没有办法将vector一次性写入文件呢?
采用流运算符重载的方法可以做到,不仅基本类型的vector可以一次性写入,存储struct的vector也是可以的,这里举一个简单的例子,声明结构体:
struct point
{
double lat; //纬度
double lon; //经度
unsigned long long time; //时间
}
写一个类封装流运算符:
class onepoint{
public:
point p;//点
public:
friend ostream& operator<< (ostream& out, const point& point)
{
//out << point.lon<<","<<point.lat<<","<<point.time<<endl;
out.write((char*) &point,sizeof(point));
return out;
}
friend istream& operator>>(istream& is, point& point)
{
is.read((char*) &point,sizeof(point));
return is;
}
};
这里需要注意,重载流运算符的函数应设为友元函数,因为类的成员二元运算符重载要求运算符左操作数为运算符函数的第一个参数,而流类库中的>>则要求第一个参数为ostream的引用,所以不能作为类成员,只能作为友元.
声明好以后就可以将整个vector写入文件了:
ofstream fout;
string str = "H:\\test.dat";
fout.open(str.c_str(),ios::binary);
vector<onepoint> pointset = track.getPointSet();
copy( pointset.begin(), pointset.end(), ostream_iterator<onepoint>(fout));//一次性写入
fout.close();
读取的方式类似:
ifstream ifs(Path, ios::binary);
ifstream ofs(Path, ios::binary | ios::ate);
vector<onepoint> v((istream_iterator<trackpoint>(ifs)), istream_iterator<trackpoint>(ofs));
当然前面的onepoint声明,不要结构体也是可以的:
class point{
public:
double lat; //纬度
double lon; //经度
unsigned long long time; //时间
public:
friend ostream& operator<< (ostream& out, const point& point)
{
//out << point.lon<<","<<point.lat<<","<<point.time<<endl;
out.write((char*) &point,sizeof(point));
return out;
}
friend istream& operator>>(istream& is, point& point)
{
is.read((char*) &point,sizeof(point));
return is;
}
};
C++重载流运算符,将存储结构体的vector直接写入文件的更多相关文章
- Go redis hash存储结构体
需求 需要存储用户数据到redis,结构是hash. 然后取出来,自动转成结构体. 结构体 type UserCache struct { Id int64 `json:"id"` ...
- 在C的头文件中定义的结构体,如何在cpp文件中引用
解决方案1:在cpp文件中放置.c,且在该文件中引用变量 解决方案2:在一个cpp文件中包含.c,但在另一个cpp文件中使用结构体变量 cpp文件1 cpp文件2 #include "dia ...
- 线性存储结构-ArrayList、Vector
ArrayList:采用数组的内部构建形式,也就是顺序存储模式.当新增一个对象时,如果当前长度超过预设,会使用System.arraycopy(定义一个更长的数组进行复制处理),这个时候开销比较大. ...
- 结构体的vector resize()与初始化
序: 我们在使用vector的时候可以自定义里面的数据类型.例如这样: struct Edge{ int from; int to; int weight; }; vector<Edge> ...
- C++结构体:默认构造函数,复制构造函数,重载=运算符
C++结构体提供了比C结构体更多的功能,如默认构造函数,复制构造函数,运算符重载,这些功能使得结构体对象能够方便的传值. 比如,我定义一个简单的结构体,然后将其作为vector元素类型,要使用的话,就 ...
- 01.C语言关于结构体的学习笔记
我对于学习的C语言的结构体做一个小的学习总结,总结如下: 结构体:structure 结构体是一种用户自己建立的数据类型,由不同类型数据组成的组合型的数据结构.在其他高级语言中称为记录(record) ...
- c语言_文件操作_FILE结构体解释_涉及对操作系统文件FCB操作的解释_
1. 文件和流的关系 C将每个文件简单地作为顺序字节流(如下图).每个文件用文件结束符结束,或者在特定字节数的地方结束,这个特定的字节数可以存储在系统维护的管理数据结构中.当打开文件时,就建立了和文件 ...
- qsettings 保存自定义结构体(QVariant与自定义结构体相互转化)
参考博文:QVariant与自定义数据类型转换的方法. 这里摘取其关键内容: 1.将自定义数据类型使用Q_DECLARE_METATYPE宏进行声明,便于编译器识别. 2.在插入对象的时候,声明QVa ...
- JDFS:一款分布式文件管理系统,第三篇(流式云存储)
一 前言 看了一下,距离上一篇博客的发表已经过去了4个月,时间过得好快啊.本篇博客是JDFS系列的第三篇博客,JDFS的目的是为了实现一个分布式的文件管理系统,前两篇实现了基本的上传.下载功能,但是那 ...
随机推荐
- hadoop修改MR的提交的代码程序的副本数
hadoop修改MR的提交的代码程序的副本数 Under-Replicated Blocks的数量很多,有7万多个.hadoop fsck -blocks 检查发现有很多replica missing ...
- gif图片加载问题
之前从没想过,gif图片在网页中显示还会有问题,不过今天算是遇到了bug,问题是在vc嵌入的网页里面,有三个需要显示加载的动态图,刚开始在html中写好,在div向上滚动显示gif的时候就成了静态的. ...
- window 配置wnmp(转下整理 ,全)
工具/原料 RunHiddenConsole.exe 下载地址:http://pan.baidu.com/share/link?shareid=100074&uk=822373947 方法 ...
- 生成yyMMddHHmmssSS时间戳代码作为唯一主键值
import java.sql.Time; import java.text.DateFormat; import java.text.ParseException; import java.text ...
- Web墨卡托投影(转)
Google Maps地图投影全解析(1):Web墨卡托投影 Google Maps.Virtual Earth等网络地理所使用的地图投影,常被称作Web Mercator或Spherical Mer ...
- [地图SkyLine二次开发]框架(3)
上节将显示我们地图的OBJECT控件,布了一下局,但地图没有进行加载. 这是因为我们要在另一个页面,对OBJECT控件进行地图加载,并且得到该控件的sgworld,以便对其进行我们想要的开发. 这里, ...
- VB模拟键盘输入的N种方法
VB模拟键盘输入的N种方法http://bbs.csdn.net/topics/90509805hd378发表于: 2006-12-24 14:35:39用VB模拟键盘事件的N种方法 键盘是我们使用计 ...
- EChart和G2比较
1.上市时间:EChart已经久经沙场,G2算是新事物 2.源码:截止发文,在Github上 数量 EChart G2 commits 3086 8 branches 3 1 releases 43 ...
- Linux文件权限查看及修改命令chmod
查看权限 Linux文件访问权限分为可读,可写和可执行三种. 可用ls -l命令查看,例: ls -l或者 ll 显示为 -r--r--r--. 1 root root 21 Jan 5 23:02 ...
- SPSS数据分析—对应分析
卡方检验只能对两个分类变量之间是否存在联系进行检验,如果分类变量有多个水平的话,则无法衡量每个水平间的联系.对此,虽然可以使用逻辑回归进行建模,但是如果分类变量的水平非常多,就需要分别设定哑变量,这样 ...