写/读的问题和对象到文件的向量

时间:2014-05-12 19:37:36

标签: c++ vector fstream

我遇到了这个问题,我想制作一个Devicelist,我用的是矢量设备。但我无法正确读/写。

这是我的职能:

#include "Devicelist.h"

bool Devicelist::AddDevice(const char *deviceName, char *type)
{
    Device tempDevice(deviceName, type, ++id_);
    Devicelist_.push_back(tempDevice);
    return true;
}

bool Devicelist::deleteDevice(const char *deviceName)
{
    for (int i = 0; i < Devicelist_.size(); i++)
    {
        if (strcmp(deviceName, Devicelist_[i].getName()) == 0)
        {
            Devicelist_.erase(Devicelist_.begin() + i);
            return true;
        }
        else
        {
            cout << "No Device found with that Devicename." << endl;
            return false;
        }
    }
}

bool Devicelist::SaveToFile()
{
    //remove("Devices.dat");

    ofstream SaveFile("Devices.dat", ios::out | ios::binary);

    if (!SaveFile)
    {
        cerr << "File could not be opened." << endl;
        return false;
    }
    for (int i = 0; i < Devicelist_.size(); i++)
        SaveFile.write((const char *)(&Devicelist_[i]), sizeof(Devicelist_[i]));


    SaveFile.close();
    return true;
}

bool Devicelist::LoadFromFile()
{
    ifstream LoadFile("Devices.dat", ios::in | ios::binary);

    if (!LoadFile)
    {
        cerr << "File could not be opened." << endl;
        return false;
    }

    for (int i = 0; i < Devicelist_.size(); i++)
        LoadFile.read((char *)(&Devicelist_[i]), sizeof(Devicelist_[i]));


    LoadFile.close();
    return true;
}

Device Devicelist::findDevice(const char *deviceName)
{
    for (int i = 0; i < Devicelist_.size(); i++)
    {
        if (strcmp(deviceName, Devicelist_[i].getName()) == 0)
            return Devicelist_[i];
        else
            cout << "Couldn't find device." << endl;
    }
}

这是我的主要内容:

#include "Devicelist.h"

void main()
{
    Devicelist list; 
    list.AddDevice("Lampe3", "Lampe");
    list.AddDevice("Lampe4", "Lampe");
    list.SaveToFile();


    Devicelist list2;
    list2.LoadFromFile();

    Device lampe = list2.findDevice("Lampe");

    cout << lampe.getName() << endl;
    cout << lampe.getID() << endl;
    cout << lampe.getType() << endl;
}

任何人都可以看到我的问题是什么吗?

提前致谢!

EDIT1:

我的Devicelist的.h文件是:

#ifndef DEVICELIST_H
#define DEVICELIST_H 

#include "Device.h"
#include <vector>
#include <string>
#include <iostream>
#include <fstream>

class Devicelist
{
public:
    Devicelist();
    bool SaveToFile();
    bool LoadFromFile();
    bool AddDevice(const char *deviceName, char *type);
    bool deleteDevice(const char *deviceName);
    Device findDevice(const char *devicename);
private:
    vector<Device> Devicelist_;
    int id_;
};

#endif

这是我的设备.h文件:

#ifndef DEVICE_H
#define DEVICE_H 

#include <iostream>
#include <string>

#define DNAME_SIZE 33

using namespace std;

class Device
{
public:
    Device(const char *devicename = "Default", char *type = "type", int id = 0);
    const char *getName();
    int getID();
    int getType();
private:
    char deviceName_[DNAME_SIZE];
    int id_;
    int type_;
};

#endif 

和Device .cpp-file:

#include "Device.h"

Device::Device(const char *deviceName, char *type, int id)
{
    strncpy_s(deviceName_, deviceName, DNAME_SIZE);

    if (type == "Lampe")
        type_ = 1;
    else if (type == "Roegalarm")
        type_ = 2;
    else if (type == "Tyverialarm")
        type_ = 3;
    else
    {
        type_ = 0;
        cout << "Type does not exists." << endl;
    }

    id_ = id;
}

const char *Device::getName()
{
    return deviceName_;
}

int Device::getID()
{
    return id_;
}

int Device::getType()
{
    return type_;
}

问题是当我尝试阅读文件中保存的内容时,这是输出: http://imgur.com/P8WEAKq

2 个答案:

答案 0 :(得分:0)

问题出现在LoadFromFile函数中,我认为:

for (int i = 0; i < Devicelist_.size(); i++)
    LoadFile.read((char *)(&Devicelist_[i]), sizeof(Devicelist_[i]));

DeviceList为空,或者尺寸错误。 您可以编写与AddDevice中类似的内容:

Device tempDevice();
LoadFile.read((char *)(&tempDevice), sizeof(tempDevice));
Devicelist_.push_back(tempDevice);

但需要知道文件的大小(设备数量)。

如评论中所述,仅当Device没有指向其他对象的指针时,此方法才有效。它应该是POD(普通旧数据)对象。

一个优雅的解决方案是在Device

上实现流媒体运营商

答案 1 :(得分:0)

在写出每个设备之前,您需要Device::StoreToFile写入设备数量。这将使您的Device::LoadFromFile知道从文件中读取的设备实例数。

我强烈建议你不要为文件写一个类或结构位。如果您的类或结构具有任何高级数据结构,例如std::stringstd::vector,则无法以二进制形式编写它们。它们可能使用指向内存的指针,当你加载它们时它们将不一样。

这是一个更好的解决方案:
1.将uint8_t的缓冲区传递给加载和存储方法 2.方法从缓冲区加载或存储到缓冲区(附加) 3.调用者将缓冲区读取或写入文件 该课程还有一个&#34;文件大小&#34;返回文件占用空间的方法,可能与结构大小不同。

还在网上搜索&#34; boost :: serialization&#34;。