avr39-ripe

binaryFileAdvanced

May 4th, 2020
201
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.54 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3.  
  4. struct Player
  5. {
  6.     int id = 0;
  7.     char* name;
  8.     int rank;
  9. };
  10. void writePlayersFile(Player* playersArr, int playersSize, int append = 0)
  11. {
  12.     std::ofstream outf;
  13.     outf.open("file.dat", std::ios::binary | append ? std::ios::app : 0);
  14.     for (int i = 0; i < playersSize; i++)
  15.     {
  16.         outf.write((char*)& playersArr[i].id, sizeof(int));
  17.         size_t nameLen = strlen(playersArr[i].name) + 1;
  18.         outf.write(playersArr[i].name, nameLen);
  19.         if (nameLen < 50) { outf.seekp(50 - nameLen, std::ios::cur); };
  20.         outf.write((char*)& playersArr[i].rank, sizeof(int));
  21.     }
  22.     outf.close();
  23. }
  24. void readPlayersFile(Player* playersArr, int playersSize)
  25. {
  26.     std::ifstream inf;
  27.     inf.open("file.dat", std::ios::binary);
  28.     char buf[100];
  29.     for (int i = 0; i < playersSize; i++)
  30.     {
  31.         inf.read((char*)& playersArr[i].id, sizeof(int));
  32.         for (int i = 0; inf.read(buf + i, 1), buf[i] and i < 100; i++);
  33.         int nameLen = strlen(buf) + 1;
  34.         playersArr[i].name = new char[nameLen];
  35.         strcpy(playersArr[i].name, buf);
  36.         if (nameLen < 50) { inf.seekg(50 - nameLen, std::ios::cur); };
  37.         inf.read((char*)& playersArr[i].rank, sizeof(int));
  38.     }
  39.     inf.close();
  40. }
  41.  
  42. int changePlayersFileById(int searchId, const char* name)
  43. {
  44.     std::fstream file;
  45.     file.open("file.dat", std::ios::in | std::ios::out | std::ios::binary);
  46.  
  47.     int id = 0;
  48.     int nameLen = 0;
  49.     for (int i = 0; i < 3; i++)
  50.     {
  51.  
  52.         file.read((char*)&id, sizeof(id));
  53.         if (id == searchId)
  54.         {
  55.             nameLen = strlen(name) + 1;
  56.             file.seekp((int)file.tellg(), std::ios::beg);
  57.             file.write(name, nameLen);
  58.             file.close();
  59.             return 0;
  60.         }
  61.         file.seekg(50 + 4, std::ios::cur);
  62.     }
  63.     file.close();
  64.     return 1;
  65. }
  66. void printPlayersArr(Player* playersArr, int playersSize)
  67. {
  68.     for (int i = 0; i < playersSize; i++)
  69.     {
  70.         std::cout << playersArr[i].id << ' ' << playersArr[i].name << ' ' << playersArr[i].rank << '\n';
  71.     }
  72. }
  73.  
  74. int main()
  75. {
  76.  
  77.     Player players[3]{ {2607, new char[sizeof("MadMax")]{"MadMax"}, 39},{2802, new char[sizeof("Batman")]{"Batman"}, 25},{2902, new char[sizeof("Joker")]{"Joker"}, 15} };
  78.     writePlayersFile(players, 3);
  79.     for (int i = 0; i < 3; i++) { delete[] players[i].name; };
  80.  
  81.     Player readPlayers[3]{};
  82.     readPlayersFile(readPlayers, 3);
  83.     printPlayersArr(readPlayers, 3);
  84.     for (int i = 0; i < 3; i++) { delete[] readPlayers[i].name; };
  85.  
  86.  
  87.     changePlayersFileById(2802, "BATMAN FOREVER YOUNG!");
  88.     changePlayersFileById(2902, "Joker Rockker :]");
  89.     readPlayersFile(readPlayers, 3);
  90.     printPlayersArr(readPlayers, 3);
  91.     for (int i = 0; i < 3; i++) { delete[] readPlayers[i].name; };
  92. }
Add Comment
Please, Sign In to add comment