Advertisement
avr39ripe

fileIOAdvExample

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