jade808
jade808

Reputation: 1

How can I get data from binary file?

I get 'binary file' made with write() member function.

'binary file' have 2'000'000 of Player.

class Player {
    string name;            // name, length[3, 15]
    int score;              // score
    size_t id;              // id, There may be overlapping IDs.
    size_t num;             // Number of bytes secured in free store
    unique_ptr<char[]> p;   // Memory secured in free store (saved characters)

write() is a member of class Player.

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

I try to save these all Player data in container.

void read(istream& is) {
    is.read(reinterpret_cast<char*>(this), sizeof(Player));
    p = make_unique<char[]>(num);
    is.read(p.get(), num);
}

But the program return aborb() error.

There's my whole code.

int main()
{
    ifstream in{ "player files", ios::binary };
    if (not in) { return 0; }

    vector<Player> players;
    
    while (in.peek() != EOF) {
        Player temp;
        temp.read(in);
        players.push_back(temp);
    }

    Player& lastPlayer = players.back();
    cout << "name: " << lastPlayer.getName() << ", id: " << lastPlayer.getId() << ", score: "
        << lastPlayer.getScore() << ", num: " << lastPlayer.getNum() << endl;
    cout << "string: " << lastPlayer.getP() << endl;
}

Q1. Is there any problem with my copy assigment operator?

public:
    Player() {}
    ~Player() {}

    Player(const Player& other)
        : name(other.name), score(other.score), id(other.id), num(other.num)
    {
        p = make_unique<char[]>(num);
        memcpy(p.get(), other.p.get(), num);
    }

    Player& operator=(const Player& rhs)
    {
        if (this == &rhs)
            return *this;

        p.reset(rhs.p.get());

        return *this;
    }

    Player(Player&& other) noexcept
        : name(move(other.name)), score(other.score), id(other.id), num(other.num)
    {
        p = move(other.p);
        other.num = 0;
    }
    Player& operator=(Player&& rhs) noexcept
    {
        if (this == &rhs)
            return *this;

        name = move(rhs.name);
        score = rhs.score;
        id = rhs.id;
        num = rhs.num;

        p = move(rhs.p);
        rhs.num = 0;

        return *this;
    }

    bool operator==(const Player& rhs) const
    {
        if (num != rhs.num)
            return false;

        return equal(p.get(), p.get() + num, rhs.p.get());
    }

    void read(istream& is) {
        is.read(reinterpret_cast<char*>(this), sizeof(Player));
        p = make_unique<char[]>(num);
        is.read(p.get(), num);
    }

        // getter
};

Q2. How can i save Player data in vector(or any container) as well?

I hope to be able to store Player data in a container and sort&searching it smoothly.

Upvotes: 0

Views: 79

Answers (0)

Related Questions