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

咱们知道,当vector很大的时候,若是使用循环的方式将其中的元素写入文件将很是费时,所以有没有办法将vector一次性写入文件呢?ios

采用流运算符重载的方法能够作到,不只基本类型的vector能够一次性写入,存储struct的vector也是能够的,这里举一个简单的例子,声明结构体:函数

struct point
{
    double lat; //纬度
    double lon; //经度
    unsigned long long time; //时间
}

写一个类封装流运算符:spa

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的引用,因此不能做为类成员,只能做为友元.code

声明好之后就能够将整个vector写入文件了:blog

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();

读取的方式相似:get

ifstream ifs(Path, ios::binary);
ifstream ofs(Path, ios::binary | ios::ate);
vector<onepoint> v((istream_iterator<trackpoint>(ifs)), istream_iterator<trackpoint>(ofs));

固然前面的onepoint声明,不要结构体也是能够的:string

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;
    }
};
相关文章
相关标签/搜索