Advertisement
avr39ripe

cppFileIOPlayersAdvanced

Jun 16th, 2021
946
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.49 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3.  
  4. const int maxNameLen{ 50 };
  5. struct Player
  6. {
  7.     int id;
  8.     char* name {nullptr};
  9.     int rank;
  10.  
  11.     void init(int idP, const char* nameP, int rankP)
  12.     {
  13.         id = idP;
  14.        
  15.         setName(nameP);
  16.  
  17.         rank = rankP;
  18.     }
  19.  
  20.     void print()
  21.     {
  22.         std::cout << id << ' ' << name << ' ' << rank << '\n';
  23.     }
  24.  
  25.     void clear()
  26.     {
  27.         delete[] name;
  28.     }
  29.  
  30.     void setName(const char* nameP)
  31.     {
  32.         size_t len{ strlen(nameP) + 1 };
  33.         if (!name)
  34.         {
  35.             name = new char[len];
  36.         }
  37.         else if (name and strlen(name)+1 < len)
  38.         {
  39.             delete[] name;
  40.             name = new char[len];
  41.         }
  42.  
  43.         strcpy_s(name, len, nameP);
  44.     }
  45.  
  46.     void fileWrite(std::ostream& outf)
  47.     {
  48.         outf.write((char*)&id, sizeof(int));
  49.         size_t nameLen = strlen(name) + 1;
  50.         outf.write(name, nameLen);
  51.         if (nameLen < maxNameLen) { outf.seekp(maxNameLen - nameLen, std::ios::cur); };
  52.         outf.write((char*)&rank, sizeof(int));
  53.     }
  54.  
  55.     void fileRead(std::istream& inf)
  56.     {
  57.         const int bufSize{ maxNameLen + 1 };
  58.         char buf[bufSize];
  59.  
  60.         inf.read((char*)&id, sizeof(int));
  61.         for (int i{ 0 }; inf.read(buf + i, 1), buf[i] and i < bufSize; ++i);
  62.         int nameLen = strlen(buf) + 1;
  63.        
  64.         setName(buf);
  65.  
  66.         if (nameLen < maxNameLen) { inf.seekg(maxNameLen - nameLen, std::ios::cur); };
  67.         inf.read((char*)&rank, sizeof(int));
  68.     }
  69.  
  70.     void changeName(const char* name)
  71.     {
  72.         std::fstream file;
  73.         file.open("file.dat", std::ios::in | std::ios::out | std::ios::binary);
  74.         int searchId{ 0 };
  75.         int nameLen{ 0 };
  76.         while(!file.eof())
  77.         {
  78.             file.read((char*)&searchId, sizeof(int));
  79.  
  80.             if (file.fail()) { break; }
  81.  
  82.             if (searchId == id)
  83.             {
  84.                 nameLen = strlen(name) + 1;
  85.                 file.seekp((int)file.tellg(), std::ios::beg);
  86.                 file.write(name, nameLen);
  87.                 file.close();
  88.  
  89.                 setName(name);
  90.  
  91.                 return;
  92.             }
  93.             file.seekg(maxNameLen + sizeof(int), std::ios::cur);
  94.         }
  95.         file.close();
  96.     }
  97. };
  98.  
  99. void writePlayers(Player* begin, Player* end)
  100. {
  101.     std::ofstream outf;
  102.     outf.open("file.dat", std::ios::binary);
  103.     for (auto player{ begin }; player != end; ++player)
  104.     {
  105.         player->fileWrite(outf);
  106.     }
  107.     outf.close();
  108. }
  109.  
  110. void readPlayers(Player* begin, Player* end)
  111. {
  112.     std::ifstream inf;
  113.     inf.open("file.dat", std::ios::binary);
  114.     for (auto player{ begin }; player != end; ++player)
  115.     {
  116.         player->fileRead(inf);
  117.     }
  118.     inf.close();
  119. }
  120.  
  121. void writePlayersFile(Player* playersArr, int playersSize, int append = 0)
  122. {
  123.     std::ofstream outf;
  124.     outf.open("file.dat", std::ios::binary | (append ? std::ios::app : 0));
  125.     for (int i{ 0 }; i < playersSize; ++i)
  126.     {
  127.         outf.write((char*)&playersArr[i].id, sizeof(int));
  128.         size_t nameLen = strlen(playersArr[i].name) + 1;
  129.         outf.write(playersArr[i].name, nameLen);
  130.         if (nameLen < maxNameLen) { outf.seekp(maxNameLen - nameLen, std::ios::cur); };
  131.         outf.write((char*)&playersArr[i].rank, sizeof(int));
  132.     }
  133.     outf.close();
  134. }
  135.  
  136. void readPlayersFile(Player* playersArr, int playersSize)
  137. {
  138.     std::ifstream inf;
  139.     inf.open("file.dat", std::ios::binary);
  140.     const int bufSzie{ 100 };
  141.     char buf[bufSzie];
  142.     for (int i{ 0 }; i < playersSize; ++i)
  143.     {
  144.         inf.read((char*)&playersArr[i].id, sizeof(int));
  145.         for (int i{ 0 }; inf.read(buf + i, 1), buf[i] and i < bufSzie; ++i);
  146.         int nameLen = strlen(buf) + 1;
  147.         playersArr[i].name = new char[nameLen];
  148.         strcpy_s(playersArr[i].name, nameLen, buf);
  149.         if (nameLen < maxNameLen) { inf.seekg(maxNameLen - nameLen, std::ios::cur); };
  150.         inf.read((char*)&playersArr[i].rank, sizeof(int));
  151.     }
  152.     inf.close();
  153. }
  154.  
  155. int changePlayersFileById(int searchId, const char* name)
  156. {
  157.     std::fstream file;
  158.     file.open("file.dat", std::ios::in | std::ios::out | std::ios::binary);
  159.  
  160.     int id{ 0 };
  161.     int nameLen{ 0 };
  162.     for (int i{ 0 }; i < 3; ++i)
  163.     {
  164.  
  165.         file.read((char*)&id, sizeof(id));
  166.         if (id == searchId)
  167.         {
  168.             nameLen = strlen(name) + 1;
  169.             file.seekp((int)file.tellg(), std::ios::beg);
  170.             file.write(name, nameLen);
  171.             file.close();
  172.             return 0;
  173.         }
  174.         file.seekg(maxNameLen + sizeof(int), std::ios::cur);
  175.     }
  176.     file.close();
  177.     return 1;
  178. }
  179. void printPlayers(Player* begin, Player* end)
  180. {
  181.     for (auto player{ begin }; player != end; ++player)
  182.     {
  183.         player->print();
  184.     }
  185. }
  186.  
  187. void clearPlayers(Player* begin, Player* end)
  188. {
  189.     for (auto player{ begin }; player != end; ++player)
  190.     {
  191.         player->clear();
  192.     }
  193. }
  194.  
  195. int main()
  196. {
  197.     const int playersCount{ 3 };
  198.     Player players[playersCount];
  199.     Player* const playersEnd{ players + playersCount };
  200.  
  201.     players[0].init(2607, "MadMax", 39);
  202.     players[0].setName("MaddyMax");
  203.     players[1].init(2802, "Batman", 25);
  204.     players[2].init(2902, "Joker", 15);
  205.  
  206.     printPlayers(players, playersEnd);
  207.  
  208.     writePlayers(players, playersEnd);
  209.  
  210.     readPlayers(players, playersEnd);
  211.  
  212.     printPlayers(players, playersEnd);
  213.  
  214.     players[0].changeName("MAD_MAX");
  215.  
  216.     readPlayers(players, playersEnd);
  217.  
  218.     printPlayers(players, playersEnd);
  219.  
  220.     clearPlayers(players, playersEnd);
  221.  
  222.     //Player players[3]{ {2607, new char[sizeof("MadMax")]{"MadMax"}, 39},{2802, new char[sizeof("Batman")]{"Batman"}, 25},{2902, new char[sizeof("Joker")]{"Joker"}, 15} };
  223.     //writePlayersFile(players, 3);
  224.     //for (int i{ 0 }; i < 3; ++i) { delete[] players[i].name; };
  225.  
  226.     //Player readPlayers[3]{};
  227.     //readPlayersFile(readPlayers, 3);
  228.     //printPlayersArr(readPlayers, 3);
  229.     //for (int i{ 0 }; i < 3; ++i) { delete[] readPlayers[i].name; };
  230.  
  231.     //changePlayersFileById(2802, "BATMAN FOREVER YOUNG!");
  232.     //changePlayersFileById(2902, "Joker Rockker :]");
  233.     //readPlayersFile(readPlayers, 3);
  234.     //printPlayersArr(readPlayers, 3);
  235.     //for (int i{ 0 }; i < 3; ++i) { delete[] readPlayers[i].name; };
  236. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement