Функция удаления для моей телефонной книги Переполнение стека

Я новичок в 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;
}
}
}

0

Решение

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

#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;
}
0

Другие решения

Других решений пока нет …