Advertisement
avr39ripe

PV913PersonClassFixedFileIO

Jun 30th, 2020
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.25 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3.  
  4. class Person
  5. {
  6.     char* fname;
  7.     char* sname;
  8.     uint32_t id;
  9.     static const uint8_t fileNameSize{ 25 };
  10. public:
  11.     Person(const char* fnameP, const char* snameP, const uint32_t idP);
  12.     Person() : fname{ nullptr }, sname{ nullptr }, id{ 0 }{};
  13.     Person(uint32_t idP) : Person(nullptr, nullptr, idP) { load(); };
  14.     Person(const Person& personP);
  15.     Person(Person&& personP);
  16.     Person& operator=(const Person& personP);
  17.     Person& operator=(Person&& personP);
  18.     ~Person() { delete[] fname; delete[] sname; };
  19.     const char* getFname() const { return fname; };
  20.     const char* getSname() const { return sname; };
  21.     const uint32_t getId() const { return id; };
  22.     Person& setFname(const char* fnameP);
  23.     Person& setSname(const char* snameP);
  24.     Person& setId(const uint32_t idP) { id = idP; return *this; };
  25.     friend std::ostream& operator<<(std::ostream& out, const Person& personP);
  26.     friend std::istream& operator>>(std::istream& out, Person& personP);
  27.     friend bool operator==(const Person& lhs, const Person& rhs);
  28.     friend bool operator!=(const Person& lhs, const Person& rhs);
  29.     bool save();
  30.     bool load();
  31. };
  32.  
  33. Person::Person(const char* fnameP, const char* snameP, const uint32_t idP)
  34.     :fname{ fnameP ? new char[strlen(fnameP) + 1] : nullptr }, sname{ snameP ? new char[strlen(snameP) + 1] : nullptr}, id{ idP }
  35. {  
  36.     if (fname)
  37.     {
  38.         strcpy_s(fname, strlen(fnameP) + 1, fnameP);
  39.     }
  40.     if (sname)
  41.     {
  42.         strcpy_s(sname, strlen(snameP) + 1, snameP);
  43.     }
  44. }
  45.  
  46. Person::Person(const Person& personP)
  47.     :fname{ new char[strlen(personP.fname) + 1] }, sname{ new char[strlen(personP.sname) + 1] }, id{ personP.id }
  48. {
  49.     strcpy_s(fname, strlen(personP.fname) + 1, personP.fname);
  50.     strcpy_s(sname, strlen(personP.sname) + 1, personP.sname);
  51. }
  52.  
  53. Person::Person(Person&& personP)
  54.     :fname{ personP.fname }, sname{ personP.sname }, id{ personP.id }
  55. {
  56.     personP.fname = nullptr;
  57.     personP.sname = nullptr;
  58.     personP.id = 0;
  59. }
  60.  
  61. Person& Person::operator=(const Person& personP)
  62. {
  63.     if (this == &personP) { return *this; }
  64.  
  65.     delete[] fname;
  66.     delete[] sname;
  67.  
  68.     fname = new char[strlen(personP.fname) + 1];
  69.     sname = new char[strlen(personP.sname) + 1];
  70.     id = personP.id;
  71.  
  72.     strcpy_s(fname, strlen(personP.fname) + 1, personP.fname);
  73.     strcpy_s(sname, strlen(personP.sname) + 1, personP.sname);
  74.  
  75.     return *this;
  76. }
  77.  
  78. Person& Person::operator=(Person&& personP)
  79. {
  80.     if (this == &personP) { return *this; }
  81.  
  82.     delete[] fname;
  83.     delete[] sname;
  84.  
  85.     fname = personP.fname;
  86.     sname = personP.sname;
  87.     id = personP.id;
  88.  
  89.     personP.fname = nullptr;
  90.     personP.sname = nullptr;
  91.     personP.id = 0;
  92.  
  93.     return *this;
  94. }
  95.  
  96. Person& Person::setFname(const char* fnameP)
  97. {
  98.     delete[] fname;
  99.     fname = new char[strlen(fnameP) + 1];
  100.     strcpy_s(fname, strlen(fnameP) + 1, fnameP);
  101.     return *this;
  102. };
  103.  
  104. Person& Person::setSname(const char* snameP)
  105. {
  106.     delete[] sname;
  107.     sname = new char[strlen(snameP) + 1];
  108.     strcpy_s(sname, strlen(snameP) + 1, snameP);
  109.     return *this;
  110. };
  111.  
  112. std::ostream& operator<<(std::ostream& out, const Person& personP)
  113. {
  114.     if (personP.fname and personP.sname and personP.id)
  115.     {
  116.         out << "[" << personP.id << ' ' << personP.fname << ' ' << personP.sname << "]";
  117.     }
  118.     else
  119.     {
  120.         out << "[empty person]";
  121.     }
  122.  
  123.     return out;
  124. }
  125.  
  126. std::istream& operator>>(std::istream& in, Person& personP)
  127. {
  128.     in >> personP.id >> personP.fname >> personP.sname;
  129.     return in;
  130. }
  131.  
  132. bool operator==(const Person& lhs, const Person& rhs)
  133. {
  134.     return (lhs.id == rhs.id and strcmp(lhs.fname, rhs.fname) == 0 and strcmp(lhs.sname, rhs.sname) == 0);
  135. }
  136.  
  137. bool operator!=(const Person& lhs, const Person& rhs)
  138. {
  139.     return !(lhs == rhs);
  140. }
  141.  
  142. bool Person::save()
  143. {
  144.     char fileName[Person::fileNameSize]{"_person"};
  145.     char idStr[10];
  146.     _itoa_s(id, idStr, 10);
  147.     strncat_s(fileName, idStr, Person::fileNameSize);
  148.  
  149.     std::ofstream out;
  150.     out.open(fileName);
  151.  
  152.     if (!out)
  153.     {
  154.         std::cout << "IOERROR! Filename: " << fileName << '\n';
  155.         return false;
  156.     }
  157.  
  158.     out << id << '\n';
  159.     out << fname << '\n';
  160.     out << sname << '\n';
  161.     out.close();
  162.  
  163.     //std::cout << "Filename: " << fileName << '\n';
  164.     return true;
  165. }
  166.  
  167. bool Person::load()
  168. {
  169.     char fileName[Person::fileNameSize]{ "_person" };
  170.     char idStr[10];
  171.     _itoa_s(id, idStr, 10);
  172.     strncat_s(fileName, idStr, Person::fileNameSize);
  173.  
  174.     char buf[255];
  175.  
  176.     std::ifstream in;
  177.     in.open(fileName);
  178.  
  179.     if (!in)
  180.     {
  181.         std::cout << "IOERROR! Filename: " << fileName << '\n';
  182.         return false;
  183.     }
  184.  
  185.     in >> id;
  186.     in.ignore();
  187.     in.getline(buf, 255);
  188.     setFname(buf);
  189.     in.getline(buf, 255);
  190.     setSname(buf);
  191.     in.close();
  192.  
  193.     //std::cout << "Filename: " << fileName << '\n';
  194.     return true;
  195.     return true;
  196. }
  197.  
  198. bool testPerson()
  199. {
  200.     const Person person1{ "Ivan", "Ivanov", 1 };
  201.     Person person2{ "Sidor", "Sidorov", 2 };
  202.  
  203.     std::cout << person1 << '\n';
  204.     std::cout << person2 << '\n';
  205.  
  206.     Person person3{ person1 };
  207.     Person person4{ std::move(person2) };
  208.  
  209.     std::cout << person3 << '\n';
  210.     std::cout << person4 << '\n';
  211.  
  212.     std::cout << person1 << '\n';
  213.     std::cout << person2 << '\n';
  214.  
  215.     Person person5{};
  216.     person5.setFname("Petr").setSname("Petrov").setId(3);
  217.  
  218.     Person person6{};
  219.     person6 = person5;
  220.  
  221.     std::cout << person5 << '\n';
  222.     std::cout << person6 << '\n';
  223.  
  224.     Person person7{};
  225.     person7 = std::move(person6);
  226.  
  227.     std::cout << person6 << '\n';
  228.     std::cout << person7 << '\n';
  229.  
  230.     Person persons[3]{ {"Ivan", "Ivanov", 1},{"Sidor","Sidorov",2},{"Petr","Petrov",3} };
  231.  
  232.     for (int i{ 0 }; i < 3; ++i)
  233.     {
  234.         std::cout << persons[i];
  235.     }
  236.     std::cout << '\n';
  237.  
  238.     Person* personsDyn = new Person[3];
  239.     personsDyn[0].setFname("Ivan").setSname("Ivanov").setId(1);
  240.     personsDyn[1].setFname("Sidor").setSname("Sidorov").setId(2);
  241.     personsDyn[2].setFname("Petr").setSname("Petrov").setId(3);
  242.  
  243.     for (int i{ 0 }; i < 3; ++i)
  244.     {
  245.         std::cout << personsDyn[i];
  246.         personsDyn[i].save();
  247.     }
  248.  
  249.     std::cout << '\n';
  250.     std::cout << "Restored from files:\n";
  251.  
  252.     Person* personsFile = new Person[3]{1,2,3};
  253.     for (int i{ 0 }; i < 3; ++i)
  254.     {
  255.  /*       std::cout << personsFile[i] << '\n';
  256.         personsFile[i].setId(i + 1);
  257.         personsFile[i].load();*/
  258.         std::cout << personsFile[i] << '\n';
  259.     }
  260.  
  261.     delete[] personsFile;
  262.  
  263.     std::cout << '\n';
  264.  
  265.     for (int i{ 0 }; i < 3; ++i)
  266.     {
  267.         personsDyn[i] = std::move(persons[i]);
  268.         std::cout << persons[i];
  269.         std::cout << personsDyn[i];
  270.     }
  271.  
  272.     delete[] personsDyn;
  273.  
  274.     std::cout << '\n';
  275.  
  276.     std::cout << (Person{ "Ivan", "Ivanov", 1 } == Person{ "Ivan", "Ivanov", 1 }) << '\n';
  277.     std::cout << (Person{ "Ivan", "Ivanov", 1 } == Person{ "Ivn", "Ivaov", 2 }) << '\n';
  278.     std::cout << (Person{ "Ivan", "Ivanov", 1 } != Person{ "Ivan", "Ivanov", 1 }) << '\n';
  279.     std::cout << (Person{ "Ivan", "Ivanov", 1 } != Person{ "Ivn", "Ivaov", 2 }) << '\n';
  280.  
  281.     return true;
  282. }
  283.  
  284. int main()
  285. {
  286.     testPerson();
  287. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement