Advertisement
CLazStudio

q201143577

Jun 5th, 2017
1,769
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.45 KB | None | 0 0
  1. #include <iostream>
  2. #include <fstream>
  3. #include <string>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. const string FNAME = "phonebook";
  9.  
  10. struct bookRecord {
  11.     string name;
  12.     string phone;
  13.     string note;
  14. };
  15.  
  16. vector<bookRecord> recs;
  17.  
  18. bool loadFromFile(string fn)
  19. {
  20.     ifstream fin(fn);
  21.  
  22.     if (fin.bad() || !fin.is_open())
  23.     {
  24.         fin.close();
  25.         return false;
  26.     }
  27.  
  28.     recs.clear();
  29.  
  30.     while (!fin.eof())
  31.     {
  32.         bookRecord t;
  33.         if (!getline(fin, t.name) ||
  34.             !getline(fin, t.phone) ||
  35.             !getline(fin, t.note))
  36.                 break;
  37.         recs.push_back(t);
  38.     }
  39.  
  40.     fin.close();
  41.     return true;
  42. }
  43.  
  44. bool saveToFile(string fn)
  45. {
  46.     ofstream fout(fn);
  47.  
  48.     if (fout.bad() || !fout.is_open())
  49.     {
  50.         fout.close();
  51.         return false;
  52.     }
  53.  
  54.     for (int i = 0; i < recs.size(); i++)
  55.     {
  56.         fout << recs[i].name << endl
  57.              << recs[i].phone << endl
  58.              << recs[i].note << endl;
  59.     }
  60.  
  61.     fout.close();
  62.     return true;
  63. }
  64.  
  65. void writeRecord(int i)
  66. {
  67.     cout << i + 1 << ". " << recs[i].name
  68.          << "\t" << recs[i].phone << " | ";
  69.     int sz = 60 - recs[i].name.size() - recs[i].phone.size();
  70.     if (recs[i].note.size() > sz)
  71.         cout << recs[i].note.substr(0, sz) << "...";
  72.             else cout << recs[i].note;
  73.     cout << endl;
  74. }
  75.  
  76. int findRecord()
  77. {
  78.     int sel;
  79.  
  80.     cout << "Вам нужно найти запись:" << endl
  81.          << "1. По порядковому номеру" << endl
  82.          << "2. По имени, номеру телефона или заметке" << endl
  83.          << "\n\n > ";
  84.  
  85.     cin >> sel;
  86.     cout << endl;
  87.  
  88.     if (sel == 2)
  89.     {
  90.         string val;
  91.         cout << "Введите значение для поиска: ";
  92.         cin.ignore();
  93.         getline(cin, val);
  94.  
  95.         for (int i = 0; i < recs.size(); i++)
  96.             if (recs[i].name.find(val) != recs[i].name.npos ||
  97.                 recs[i].note.find(val) != recs[i].note.npos ||
  98.                 recs[i].phone == val)
  99.                     writeRecord(i);
  100.  
  101.         cout << endl;
  102.     }
  103.  
  104.     int number = 0;
  105.     bool fail = false;
  106.  
  107.     cout << "Введите порядковый номер записи: ";
  108.     cin >> number;
  109.     cin.ignore();
  110.  
  111.     return (number < 1 || number > recs.size()) ? -1 : number - 1;
  112. }
  113.  
  114. void writeRecords()
  115. {
  116.     cout << "Всего " << recs.size() << " записей:" << endl;
  117.  
  118.     for (int i = 0; i < recs.size(); i++)
  119.         writeRecord(i);
  120.  
  121.     cin.get();
  122. }
  123.  
  124. void addRecord()
  125. {
  126.     bookRecord r;
  127.     cout << "\n\n\t\t[ Добавление новой записи ]\n\n";
  128.  
  129.     cout << "Введите номер телефона: ";
  130.     getline(cin, r.phone);
  131.     cout << "Введите имя записи: ";
  132.     getline(cin, r.name);
  133.     cout << "Напишите примечание к записи: " << endl;
  134.     getline(cin, r.note);
  135.  
  136.     recs.push_back(r);
  137.     cout << "Новая запись с порядковым номером "
  138.          << recs.size() << " добавлена!" << endl;
  139.     cin.get();
  140. }
  141.  
  142. void editRecord()
  143. {
  144.     cout << "\n\n\t\t[ Изменение записи ]\n\n";
  145.  
  146.     int id = findRecord();
  147.     if (id == -1)
  148.     {
  149.         addRecord();
  150.         return;
  151.     }
  152.     string temp = "";
  153.  
  154.     cout << "Примечаение: Чтобы оставить поле без изменений, просто нажмите Ввод.\n\n";
  155.  
  156.     cout << "Введите новый номер телефона: ";
  157.     getline(cin, temp);
  158.     if (temp.size() > 0)
  159.         recs[id].phone = temp;
  160.     cout << "Введите новое имя записи: ";
  161.     getline(cin, temp);
  162.     if (temp.size() > 0)
  163.         recs[id].name = temp;
  164.     cout << "Напишите новое примечание к записи: " << endl;
  165.     getline(cin, temp);
  166.     if (temp.size() > 0)
  167.         recs[id].note = temp;
  168.  
  169.     cout << "Запись изменена!" << endl;
  170.     cin.get();
  171. }
  172.  
  173. void deleteRecord()
  174. {
  175.     cout << "\n\n\t\t[ Изменение записи ]\n\n";
  176.  
  177.     char ans = 'n';
  178.     int id = findRecord();
  179.     if (id == -1)
  180.     {
  181.         cout << "Удаление не удалось!" << endl;
  182.         return;
  183.     }
  184.  
  185.     cout << endl;
  186.     writeRecord(id);
  187.     cout << endl;
  188.     cout << "Вы уверены? (y/n)? ";
  189.     cin.get(ans);
  190.  
  191.     if (ans == 'y' || ans == 'Y')
  192.     {
  193.         recs.erase(recs.begin() + id);
  194.         cout << "Запись с порядковым номером "
  195.              << id + 1 << " удалена!" << endl
  196.              << "Учтите, что все порядковые номера других записей сдвинулись!" << endl;
  197.         cin.ignore();
  198.         cin.get();
  199.     }
  200. }
  201.  
  202. bool thinkMenu()
  203. {
  204.     int sel;
  205.  
  206.     cout << "\n\n\t\t[ Главное меню ]\n\n";
  207.     cout << "1. Посмотреть список записей (" << recs.size() << ")" << endl
  208.          << "2. Добавить новую запись" << endl
  209.          << "3. Отредактировать запись" << endl
  210.          << "4. Удалить запись" << endl
  211.          << "5. Сохранить телефонную книжку" << endl
  212.          << "6. Сохранить и выйти" << "\n\n > ";
  213.  
  214.     cin >> sel;
  215.     cin.ignore();
  216.     cout << endl;
  217.  
  218.     switch (sel)
  219.     {
  220.         case 1: writeRecords(); break;
  221.         case 2: addRecord(); break;
  222.         case 3: editRecord(); break;
  223.         case 4: deleteRecord(); break;
  224.         case 5:
  225.             cout << (saveToFile(FNAME) ? "Сохранено!" : "Ошибка при сохранении!") << endl;
  226.             cin.get();
  227.         break;
  228.         case 6: return false; break;
  229.         default:  break;
  230.     }
  231.  
  232.     return true;
  233. }
  234.  
  235. int main()
  236. {
  237.     setlocale(LC_ALL, "Russian");
  238.  
  239.     loadFromFile(FNAME);
  240.  
  241.     while(thinkMenu()) {};
  242.  
  243.     bool doTryAgain = true;
  244.     while (!saveToFile(FNAME) && doTryAgain)
  245.     {
  246.         cout << "\n\n\t\t[ Внимание! ]\n\n"
  247.              << "Возникла ошибка при сохранении файла телефонной книжки: "
  248.              << FNAME << "\nХотите попробовать сохранить еще раз (y/n)? ";
  249.         char ans = 'n';
  250.         cin.get(ans);
  251.         doTryAgain = (ans == 'y' || ans == 'Y');
  252.     }
  253.  
  254.     return 0;
  255. }
  256. // By CLazStydio // otvet mail ru/question/201143577 //
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement