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

Thi*_*sen 1 c++ fstream vector

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

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

vector<Device*> Devicelist_;
Run Code Online (Sandbox Code Playgroud)

我试图加载设备使用这个功能(我已经做了一个保存功能,它有效):

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;
}
Run Code Online (Sandbox Code Playgroud)

问题是LoadFile.read()不会将任何设备加载到设备列表中.

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

phy*_*us9 5

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

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

for (int i = 0; i < numberOfDevices; i++)
Run Code Online (Sandbox Code Playgroud)

应该

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

查找号码的另一种方法是使用stat:

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

或者,如果你想避免使用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;
}
Run Code Online (Sandbox Code Playgroud)

通过这种方式,它可以读取所有这些内容,而不会弄乱位置,并在完成时保持计数.