簡體   English   中英

Ifstream讀取功能未加載到向量中

[英]Ifstream read function doesn't load into vector

我是編程的新手,所以我不確定如何搜索此問題,並且我知道我還問了另外兩個問題,但似乎無法使其工作。

我遇到一個問題,在這里我有一個向量:

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()不會將任何設備加載到設備列表中。

你能看到我的問題是什么嗎? 提前致謝。

您的問題實際上非常簡單。 您忘記了重置職位:

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

或者,如果您想避免統計信息,則可以執行以下操作:

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;
}

這樣,它可以讀取所有信息,而不會弄亂位置,並在完成時保持計數。

這條線

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 s到從文件中讀取。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM