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;
    }
};
时间: 2024-08-17 22:39:47

C++重载流运算符,将存储结构体的vector直接写入文件的相关文章

在C的头文件中定义的结构体,如何在cpp文件中引用

解决方案1:在cpp文件中放置.c,且在该文件中引用变量 解决方案2:在一个cpp文件中包含.c,但在另一个cpp文件中使用结构体变量 cpp文件1 cpp文件2 #include "dialog3.h" #include <QDebug> extern "C" { typedef struct PRINT { unsigned char Parameters;//BitDepthAC,BitDepthDC,q unsigned char PlaneCo

STL之List存储结构体

题目描述: 编写程序,实现如下学生信息处理功能(要求用List链表实现) 1) 输入每个学生的信息(学号.姓名.性别及三门课程成绩): 2) 插入学生信息: 3) 删除学生信息: 4) 输入某学生姓名,显示该生的信息: 5) 计算全班每名学生的平均成绩,并显示: 测试代码: #include <iostream> #include <string> #include <list> #include <algorithm> using std::cin; us

将结构体数组中内容以文件形式的导出

void fileOutput(contacts student[] , int n){ ofstream out ; out . open("tongxunlu-new.txt") ; for(int i = 0 ; i<= n-1 ; i++){ out << "学号" << '\t' <<'\t' << student[i].studentnum << '\n'; out << &q

C++结构体:默认构造函数,复制构造函数,重载=运算符

做leetcode的时候经常看到有结构体的默认构造函数,觉得很奇怪,才发现原来c++的结构体与c语言的结构体不一样,c++的结构体更像是一个类, C++结构体提供了比C结构体更多的功能,如默认构造函数,复制构造函数,运算符重载,这些功能使得结构体对象能够方便的传值. 比如,我定义一个简单的结构体,然后将其作为vector元素类型,要使用的话,就需要实现上述三个函数,否则就只能用指针了. 转:http://blog.csdn.net/fu_zk/article/details/10539705 #

87.重载流式运算符以及外部函数重载运算符

1 #define _CRT_SECURE_NO_WARNINGS 2 #include <iostream> 3 using namespace std; 4 5 class box 6 { 7 private: 8 int x; 9 int y; 10 int z; 11 12 13 public: 14 box() :x(10), y(20), z(30) 15 { 16 17 } 18 19 friend box operator +(const box &box1, cons

结构体和它在链表中的使用

一.结构体 由不同类型的数据组合成一个整体,以便引用,这些组合在一个整体中的数据是互相联系的. 1.1如何声明结构体呢? struct 结构体名  //结构体名字用作结构体类型的标志 {成员列表}; 比如: 1 struct student 2 { 3 int num; //2 4 char name[20]; //20 5 char sex; //1 6 int age; //2 7 float score; //4 8 char addr[30]; //30 9 }; 注意:声明只是指定了一

FILE 结构体的定义,inode ,软链接和硬链接的理解

一.FILE结构体: C将每个文件简单地作为顺序字节流.每个文件用文件结束符结束,或者在特定字节数的地方结束,这个特定的字节数可以存储在系统维护的管理数据结构中.当打开文件时,就建立了和文件的关系. 在开始执行程序的时候,将自动打开3个文件和相关的流:标准输入流.标准输出流和标准错误.流提供了文件和程序的通信通道.例如,标准输入流使得程序可以从键盘读取数据,而标准输出流使得程序可以在屏幕上输出数据.打开一个文件将返回指向FILE结构(在stdio.h中定义)的指针,它包含用于处理文件的信息,也就

qsettings 保存自定义结构体(QVariant与自定义结构体相互转化)

参考博文:QVariant与自定义数据类型转换的方法. 这里摘取其关键内容: 1.将自定义数据类型使用Q_DECLARE_METATYPE宏进行声明,便于编译器识别. 2.在插入对象的时候,声明QVariant对象,使用其setValue方法添加自定义对象. 3.在读取的时候,采用QVariant对象的value方法返回自定义对象. 写入: //类型转换 QVariant v; v.setValue(MyStruct);  读取: //转换为自定义的结构体实例 MyStruct s = v.va

结构体 字节对齐

转自:http://www.cnblogs.com/longlybits/articles/2385343.html   (有改动) 内存对齐 在用sizeof运算符求某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题.从理论上讲,对于任何变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列,而不是简单地顺序排列,这就是内存对齐. 内存对齐的原因: 1)某些平台