Функция удаления для моей телефонной книги C++

Я новичок в C++, и я пытаюсь создать список контактов с некоторыми простыми функциями добавления, поиска и удаления контактов. Я новичок (так что будьте любезны), и я стараюсь сделать этот код максимально простым.

Проблема только в том, что моя функция удаления не будет работать должным образом. У меня уже есть функция добавления, которая сохраняет выбранные контакты в файл.txt, в своей функции удаления я читаю контакты из моего файла.txt с помощью ifstream, я создаю новый Ofstream = temp, а затем я пытаюсь прочитать все контакты (без тех, которые я хочу удалить) в мой временный каталог, и, наконец, я пытаюсь удалить мой предыдущий оригинальный файл.txt и переименовать мой временный файл в мой основной файл.txt. Проблема в том, что даже если я удалю свой оригинальный файл.txt, он все равно будет в карте каталогов, и я не знаю почему. И моя функция удаления, похоже, тоже не работает должным образом, потому что кажется, что она может удалить только один контакт, и когда я пытаюсь удалить другой контакт, новый контакт удаляется, но затем первый удаленный контакт снова появляется. Что не так с моим кодом?

У меня пока 3 разных.cpp файла. main.cpp, add.cpp и delete.cpp и 1 заголовок.

Моя функция добавления только добавляет контакты в.txt с помощью ofstream, и текстовый файл выглядит так после добавления контакта:

(Имя: Боб Дилан
Электронная почта: bob_dylan.bob@bob.se
Адрес: Bobdylansroad
Дата рождения: блабла
Номер телефона: 2343298492384)

Итак, каждый контакт хранится в общей сложности 5 строк, и если кто-то может сказать мне, почему он не удаляется и работает должным образом, совет для начинающих будет полезным!

Вот как выглядит моя функция удаления:

#include <iostream>
#include "Header.h"
#include <string>
#include <fstream>
#include <stdio.h>

using namespace std;

void del()
{       
checkpoint:

   int menu = 3;
   string line, name;

   cout << "------------------------------------------------------" 
      << '\n'
      << " Please Enter the name of Contact you want to delete: " 
      << '\n'
      << "------------------------------------------------------" 
      << endl;

   cin.ignore();
   getline(cin, name);

   ifstream textbook;
   ofstream temp;

   textbook.open("Textbook.txt");
   temp.open("temp.txt", ios::app);

   while (menu)
   {
      if (menu == 2)
      {
         textbook.close();
         cout << "Going back to main menu" << endl;
         system("pause"); 
         system("cls");
         return;
      }
      else if (menu == 1)
      {
         goto checkpoint;
      }
      else if (menu == 3)
      { 
         //this is where all contacts except for the chosen one + the next  
         // 4 lines are read to the temp object
         int skip = 0;
         while (getline(textbook, line))
         {
            if (line != name && !(skip > 0))
            {
               temp << line << endl;
            }
            else 
            {
               if(skip == 0)
               {
                  skip = 4;
               }
               else
               {
                  --skip;
               }
            }
         }

         cout << "The contact with the name " << name << " has 
            been deleted if it exsisted" << endl;
         system("pause");

         temp.close();
         textbook.close();
         remove("Textbook.txt");

         rename("temp.txt", "Textbook.txt");

         cout << '\n'
            << "Press 1 for: deleting another contact" << '\n'
            << "Press 2 for: Going back to Main menu" << '\n'
            << endl;

         cin >> menu;
      }
   }
}

1 ответ

Я полагаю, это король работы Гомера, так что вроде шаблон

#include <algorithm>
#include <chrono>
#include <fstream>
#include <list>
#include <iostream>
...

struct phone_record {
  std::string name;
  std::string email;
  std::string address;
  std::time_t birth_date;
  std::string phonenumber;
};

std::ostream& operator<<(std::ostream& to, const phone_record& r) {
return to << r.name << ' ' << r.email << ' ' << r.address << ' ' << r.birth_date << ' ' << r.phonenumber;
}

class phone_book {
public:
  explicit phone_book(const std::string& file_name):
    book_()
  { 
   std::ifstream file(file_name);
   // I will load my phone book data from file here
   ....
  }
  void save(const std::string& file_name) {
   std::ofstream out(file_name);
   // this will store my records into file
   std::foreach(book_.begin(), book_.end(), [out] (const phone_record& r) {
      out << r << std::endl;
   } );
   out.close();
  }
  void add_record(const phone_record& record) {
    book_.push_back(record);
  }
  void remove_record_by_name(const std::string& name) {
     book_.remove_if(book_.begin(), book_.end(), [name] (const 
      phone_record& rec) {
        return rec.name == name;
     });
  }
  // I'll add a few more functions to remove records by another search criterias
private:
  std::list<phone_record> book_;
};

int main(int argc, const char **argv) {
  // I'll obtain file name from command line here
  // and check file exit
  phone_book book(file_name);
  book_.remove("Bob Dylan");
  std::chrono::system_clock::time_point now = std::chrono::system_clock::now();
  book_.add( {"Bob Dylan", "bob_dylan.bob@bob.se", "Bobdylansroad", std::chrono::system_clock::to_time_t(now), "2343298492384" } );
  phone_book.save(file_name);
  return 0;
}
Другие вопросы по тегам