Ifstream读取功能不会加载到矢量中

时间:2014-05-13 20:53:25

标签: c++ vector fstream

我对编程有点新意,所以我不确定如何搜索这个问题,我知道我问过其他2个问题,但我似乎无法做到这一点工作

我遇到了问题,我有一个矢量:

vector<Device*> Devicelist_;

我尝试加载设备以使用此功能(我已经创建了一个保存功能,它有效):

bool Devicelist::LoadFromFile() //Opdaterer vector<Device> fra fil
{
    ifstream LoadFile("Devices.dat", ios::in | ios::binary);

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

    LoadFile.seekg(0, ios::end);
    int numberOfDevices = LoadFile.tellg() / sizeof(Device);

    for (int i = 0; i < numberOfDevices; i++)
    {   
        Devicelist_.push_back(new Device);
        LoadFile.read(reinterpret_cast<char *>(Devicelist_[i]), sizeof(Device));
    }

    cout << Devicelist_[0]->getName() << endl;

    LoadFile.close();
    return true;
}

问题是LoadFile.read()没有将任何设备加载到设备列表中。

你能看出我的问题是什么吗?提前谢谢。

2 个答案:

答案 0 :(得分:5)

你的问题其实很简单。你忘了重置你的获取位置:

LoadFile.seekg(0, ios::end);
int numberOfDevices = LoadFile.tellg() / sizeof(Device);

for (int i = 0; i < numberOfDevices; i++)

应该是

LoadFile.seekg(0, ios::end);
int numberOfDevices = LoadFile.tellg() / sizeof(Device);
LoadFile.seekg(0L, ios::beg);
for (int i = 0; i < numberOfDevices; i++)

查找号码的替代方法是使用stat:

#include <sys/stat.h>
int getNumberOfDevices(char *filename)
{
    struct stat st;
    return st.st_size / sizeof(Device);
}

或者,如果你想避免使用stat,你可以这样做:

bool Devicelist::LoadFromFile() //Opdaterer vector<Device> fra fil
{
    ifstream LoadFile("Devices.dat", ios::in | ios::binary);
    if (!LoadFile)
    {
        cerr << "File could not be opened." << endl;
        return false;
    }
    int numberOfDevices = 0;
    while (true)
    {   
        Device *tmp = new device; 
        LoadFile.read(reinterpret_cast<char *>(tmp), sizeof(Device));
        if (LoadFile.good()) //we successfully read one
        {
            ++numberOfDevices;
            Devicelist_.push_back(tmp);
        }
        else break; //get out of the infinite loop
    }
    cout << Devicelist_[0]->getName() << endl;
    LoadFile.close();
    return true;
}

这样,它会读取所有这些内容,而不会弄乱位置,并在完成时保持计数。

答案 1 :(得分:0)

这一行

LoadFile.seekg(0, ios::end);

将文件放在文件的末尾。你需要在一开始就把它放回去

LoadFile.seekg(0, ios::beg);

<强>更新

您可以通过在文件顶部保存Device的数量来简化代码。然后,您可以使用:

int numberOfDevices = 0;
LoadFile.read(&numberOfDevies, sizeof(int));

for (int i = 0; i < numberOfDevices; i++)

不需要获取文件的大小来推断Device的数量。

另一种选择是@ phyrrus9建议的那个,你继续阅读Device s,直到不再有Device个从文件中读取。