Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <fstream>
- const int maxNameLen{ 50 };
- struct Player
- {
- int id;
- char* name {nullptr};
- int rank;
- void init(int idP, const char* nameP, int rankP)
- {
- id = idP;
- setName(nameP);
- rank = rankP;
- }
- void print()
- {
- std::cout << id << ' ' << name << ' ' << rank << '\n';
- }
- void clear()
- {
- delete[] name;
- }
- void setName(const char* nameP)
- {
- size_t len{ strlen(nameP) + 1 };
- if (!name)
- {
- name = new char[len];
- }
- else if (name and strlen(name)+1 < len)
- {
- delete[] name;
- name = new char[len];
- }
- strcpy_s(name, len, nameP);
- }
- void fileWrite(std::ostream& outf)
- {
- outf.write((char*)&id, sizeof(int));
- size_t nameLen = strlen(name) + 1;
- outf.write(name, nameLen);
- if (nameLen < maxNameLen) { outf.seekp(maxNameLen - nameLen, std::ios::cur); };
- outf.write((char*)&rank, sizeof(int));
- }
- void fileRead(std::istream& inf)
- {
- const int bufSize{ maxNameLen + 1 };
- char buf[bufSize];
- inf.read((char*)&id, sizeof(int));
- for (int i{ 0 }; inf.read(buf + i, 1), buf[i] and i < bufSize; ++i);
- int nameLen = strlen(buf) + 1;
- setName(buf);
- if (nameLen < maxNameLen) { inf.seekg(maxNameLen - nameLen, std::ios::cur); };
- inf.read((char*)&rank, sizeof(int));
- }
- void changeName(const char* name)
- {
- std::fstream file;
- file.open("file.dat", std::ios::in | std::ios::out | std::ios::binary);
- int searchId{ 0 };
- int nameLen{ 0 };
- while(!file.eof())
- {
- file.read((char*)&searchId, sizeof(int));
- if (file.fail()) { break; }
- if (searchId == id)
- {
- nameLen = strlen(name) + 1;
- file.seekp((int)file.tellg(), std::ios::beg);
- file.write(name, nameLen);
- file.close();
- setName(name);
- return;
- }
- file.seekg(maxNameLen + sizeof(int), std::ios::cur);
- }
- file.close();
- }
- };
- void writePlayers(Player* begin, Player* end)
- {
- std::ofstream outf;
- outf.open("file.dat", std::ios::binary);
- for (auto player{ begin }; player != end; ++player)
- {
- player->fileWrite(outf);
- }
- outf.close();
- }
- void readPlayers(Player* begin, Player* end)
- {
- std::ifstream inf;
- inf.open("file.dat", std::ios::binary);
- for (auto player{ begin }; player != end; ++player)
- {
- player->fileRead(inf);
- }
- inf.close();
- }
- void writePlayersFile(Player* playersArr, int playersSize, int append = 0)
- {
- std::ofstream outf;
- outf.open("file.dat", std::ios::binary | (append ? std::ios::app : 0));
- for (int i{ 0 }; i < playersSize; ++i)
- {
- outf.write((char*)&playersArr[i].id, sizeof(int));
- size_t nameLen = strlen(playersArr[i].name) + 1;
- outf.write(playersArr[i].name, nameLen);
- if (nameLen < maxNameLen) { outf.seekp(maxNameLen - nameLen, std::ios::cur); };
- outf.write((char*)&playersArr[i].rank, sizeof(int));
- }
- outf.close();
- }
- void readPlayersFile(Player* playersArr, int playersSize)
- {
- std::ifstream inf;
- inf.open("file.dat", std::ios::binary);
- const int bufSzie{ 100 };
- char buf[bufSzie];
- for (int i{ 0 }; i < playersSize; ++i)
- {
- inf.read((char*)&playersArr[i].id, sizeof(int));
- for (int i{ 0 }; inf.read(buf + i, 1), buf[i] and i < bufSzie; ++i);
- int nameLen = strlen(buf) + 1;
- playersArr[i].name = new char[nameLen];
- strcpy_s(playersArr[i].name, nameLen, buf);
- if (nameLen < maxNameLen) { inf.seekg(maxNameLen - nameLen, std::ios::cur); };
- inf.read((char*)&playersArr[i].rank, sizeof(int));
- }
- inf.close();
- }
- int changePlayersFileById(int searchId, const char* name)
- {
- std::fstream file;
- file.open("file.dat", std::ios::in | std::ios::out | std::ios::binary);
- int id{ 0 };
- int nameLen{ 0 };
- for (int i{ 0 }; i < 3; ++i)
- {
- file.read((char*)&id, sizeof(id));
- if (id == searchId)
- {
- nameLen = strlen(name) + 1;
- file.seekp((int)file.tellg(), std::ios::beg);
- file.write(name, nameLen);
- file.close();
- return 0;
- }
- file.seekg(maxNameLen + sizeof(int), std::ios::cur);
- }
- file.close();
- return 1;
- }
- void printPlayers(Player* begin, Player* end)
- {
- for (auto player{ begin }; player != end; ++player)
- {
- player->print();
- }
- }
- void clearPlayers(Player* begin, Player* end)
- {
- for (auto player{ begin }; player != end; ++player)
- {
- player->clear();
- }
- }
- int main()
- {
- const int playersCount{ 3 };
- Player players[playersCount];
- Player* const playersEnd{ players + playersCount };
- players[0].init(2607, "MadMax", 39);
- players[0].setName("MaddyMax");
- players[1].init(2802, "Batman", 25);
- players[2].init(2902, "Joker", 15);
- printPlayers(players, playersEnd);
- writePlayers(players, playersEnd);
- readPlayers(players, playersEnd);
- printPlayers(players, playersEnd);
- players[0].changeName("MAD_MAX");
- readPlayers(players, playersEnd);
- printPlayers(players, playersEnd);
- clearPlayers(players, playersEnd);
- //Player players[3]{ {2607, new char[sizeof("MadMax")]{"MadMax"}, 39},{2802, new char[sizeof("Batman")]{"Batman"}, 25},{2902, new char[sizeof("Joker")]{"Joker"}, 15} };
- //writePlayersFile(players, 3);
- //for (int i{ 0 }; i < 3; ++i) { delete[] players[i].name; };
- //Player readPlayers[3]{};
- //readPlayersFile(readPlayers, 3);
- //printPlayersArr(readPlayers, 3);
- //for (int i{ 0 }; i < 3; ++i) { delete[] readPlayers[i].name; };
- //changePlayersFileById(2802, "BATMAN FOREVER YOUNG!");
- //changePlayersFileById(2902, "Joker Rockker :]");
- //readPlayersFile(readPlayers, 3);
- //printPlayersArr(readPlayers, 3);
- //for (int i{ 0 }; i < 3; ++i) { delete[] readPlayers[i].name; };
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement