簡體   English   中英

如何從二進制文件中讀取數據並推回向量?

[英]How do i read data from binary file and push back to a vector?

我提前為我缺乏解釋道歉,因為我不擅長英語。 我創建了一個存儲這些對象的二進制文件。 我想閱讀它並推回矢量,但我不知道該怎么做。

class Player
{
    string name;
    int score;
    int id;
    size_t num; 
    char* p;
};

這些函數在寫入二進制文件時使用。

void write(ostream& os) 
{
        os.write((char*)this, sizeof(Player));
        os.write((char*)p, num);
}

這是 class 的運算符重載 function。 下面是主要的function,就是這樣寫來讀取文件的,但是效果不好。

istream& operator>> (istream& is, Player& p)
{
    getline(is, p.name, '\0');
    is.read((char*)&p.score, sizeof(int));
    is.read((char*)&p.id, sizeof(int));
    is.read((char*)&p.num, sizeof(size_t));

    return is;
}

int main()
{
    ifstream in{ "Myfile", ios::binary };
    vector<Player> players(istream_iterator<Player>(in), {});
}

我應該怎么做才能讀取文件? 我想讀取每個 object 的數據,但我認為正在讀取的數據比我想要的要多。

#include <iostream>
#include <fstream>
#include <vector>
#include <string>

using namespace std;

class Player
{
    string name;
    int score;
    int id;
    size_t num;
    char* p;

public:
    Player(): name{NULL}, score{0}, id{0}, num{0}, p{nullptr}
    {}

    Player(string name, int score, int id, size_t num) :
        name{ name }, score{ score }, id{ id }, num{ num }, p{ new char[num] }
    {}
    
    ~Player() 
    { 
        delete[] p; 
    }

    /*Player(const Player& other) : name{ other.name }, score{ other.score }, id{ other.id }, num{ other.num }, p{ new char[num] }
    {
        memcpy(p, other.p, num);
    }*/

    void write(ostream& os) {
        os.write((char*)this, sizeof(Player));
        os.write((char*)p, num);
    }

    friend istream& operator>> (istream& is, Player& p);
};

istream& operator>> (istream& is, Player& p)
{
    getline(is, p.name, '\0');
    is.read((char*)&p.score, sizeof(int));
    is.read((char*)&p.id, sizeof(int));
    is.read((char*)&p.num, sizeof(size_t));

    return is;
}

int main()
{
    ifstream in{ "Myfile", ios::binary };
    vector<Player> players(istream_iterator<Player>(in), {});

    in.close();
}

鑒於您提供的信息稀缺,我相信這可能是您正在尋找的:

    std::copy(
            std::istream_iterator<int>(in),
            std::istream_iterator<int>(),
            players.begin()
            );

您可以#include <iterator>使std::istream_iterator可用。

暫無
暫無

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

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