Reputation: 1
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