Vector С++

Добрый день! Подскажите пожалуйста как вот такую запись проделать в векторе:

fstream fs("Phone_book.bin", ios::out | ios::binary);
			if (fs.is_open())
			{
				fs.write((char*)&size, sizeof(int));
				for (int i = 0; i < size; ++i)
				{
					arr[i].save(fs);
				}
				fs.close();
			}
			delete[]arr; 

Функция save() выглядит так, тоже не уверен, что это правильно:

void save(fstream& fs)
	{
		fs.write((char*)&id, sizeof(int));
		
		size_t len_name = name.size() + 1;
		fs.write((char*)&len_name, sizeof(len_name));
		fs.write((char*)name.c_str(), len_name);
		
		size_t len_sname = surname.size() + 1;
		fs.write((char*)&len_sname, sizeof(len_sname));
		fs.write((char*)surname.c_str(), len_sname);

		size_t len_adds = adds.size() + 1;
		fs.write((char*)&len_adds, sizeof(len_adds));
		fs.write((char*)adds.c_str(), len_adds);

		size_t len_numb = number.size() + 1;
		fs.write((char*)&len_numb, sizeof(len_numb));
		fs.write((char*)number.c_str(), len_numb);
	}

Вот, что я пытаюсь реализовать вообще:

int main()
{
	static int s_id = 1;
	vector<Phone_book>contacts;
	Phone_book obj;
	int action = 0;
	do
	{
		obj.menu();
		cin >> action;
		switch (action)
		{
		case 1:
			obj.setContact();
			contacts.push_back(obj);
			obj.setID(s_id);
			s_id++;
			break;
		case 2:
			
			break;
		case 3:
			break;
		case 4:
			fstream fs("Phone_book.bin", ios::out | ios::binary);
			if (fs.is_open())
			{
				fs.write((char*)&size, sizeof(int));
				for (int i = 0; i < size; ++i)
				{
					arr[i].save(fs);
				}
				fs.close();
			}
			delete[]arr; 
		}
	} while (action != 7);
	return 0;

Так а проблема в чем?

не нужно:

Вроде разобрался, спасибо. Теперь не могу понять, почему если номер контакта 2, то он записывается в файл два раза, если 3 - 3 раза и так далее

static int s_id = 1;
	vector<Phone_book>contacts;
	Phone_book obj;
	string res;
	fstream fs;
	int action = 0;
	do
	{
		obj.menu();
		cin >> action;
		cin.get();
		if (action == 1)
		{
			obj.setContact();
			obj.setID(s_id);
			s_id++;
			contacts.push_back(obj);
			res = to_string(obj.getID()) + " " + obj.getName() + " " + obj.getSurname() + " " + obj.getAddress() + " " + obj.getNumber();
			try
			{
				fs.open("Phone_book.txt", ios::app|ios::ate);
				if (!fs.is_open())
					throw logic_error("Phone_book.txt can not be opened");
				for (int i = 0; i < contacts.size(); i++)
				{
					fs << res << endl;
				}
				fs.close();
			}
			catch (logic_error & ex)
			{
				cerr << "Error: " << ex.what() << endl;
			}
		}

Тут один элемент зачем-то записывается столько раз, сколько сейчас элементов в списке.

Так это список контактов или список телефонных книг?)

Ну у меня класс книга, а это вектор из объектов этого класса

Так значит это список телефонных книг? :slight_smile:
Тут так написано:

И что нужно сделать?

class Phone_book
{
	static int s_id;
	int id = 0;
	string name;
	string surname;
	string adds;
	string number;

Не называть контакт телефонной_книгой )

А с этим что делать?

:arrow_down:

Сделать еще один класс книга с полем вектор?

Я не понимаю, что вы имеете в виду. Именно этого я не могу понять, почему так происходит:

Этот переименовать для начала.

Как написано, так и происходит.
image

Вот дурак! Теперь понял, спасибо))

Помогите тогда уже с чтением из файла и последующим выводом на экран. Я сделал так, но это не очень красиво получается. Хочется, чтобы оно выглядело как и в файле.

fstream fs("Phone_book.txt");
			vector<string> vs;
			string s;
			while (fs >> s) 
			{
				vs.push_back(s);
			}

			for (int i = 0; i < vs.size(); i++) 
			{

				cout << vs[i] << " ";
			}
			cout<<endl;
			fs.close();

Я так понимаю, нужно перегрузить оператор << потом создать такой же вектор как и в начале и push_back()? Так оно заработает?

getline чтобы читать всю строку.

  while (getline(fs, s)) {
    cout << s << endl;
  }

Почему оно не работает и программа вылетает с ошибкой, хоть и выводит содержимое на экран?
Вот так происходит добавление контакта и его запись в файлы (бинарный и текстовый):

obj.setContact();
			obj.setID(s_id);
			s_id++;
			contacts.push_back(obj);
			res = to_string(obj.getID()) + " " + obj.getName() + " " + obj.getSurname() + " " + obj.getAddress() + " " + obj.getNumber();
			try
			{
				fs.open("Phone_book.txt", ios::app|ios::ate);
				if (!fs.is_open())
					throw logic_error("Phone_book.txt can not be opened");
				fs << res << endl;
				fs.close();				
			}
			catch (logic_error & ex)
			{
				cerr << "Error: " << ex.what() << endl;
			}
			fstream fs("Phone_book.bin", ios::app | ios::binary);
			if (fs.is_open())
			{
				fs.write((char*)&obj, sizeof(Phone_book));
				fs.close();
			}

Вот так, я его пытаюсь считать с бинарного файла:

Phone_book obj1;
			fstream fs("Phone_book.bin", ios::in | ios::binary);
			if (fs.is_open())
			{
				while (fs.read((char*)&obj1, sizeof(Phone_book)))
				{
					cout << obj1.getID() << " " << obj1.getName() << " " << obj1.getSurname() << " " << obj1.getAddress() << " " << obj1.getNumber() << endl;
				}
				
				fs.close();
			}

Вылетает где и с какой ошибкой?

Вылетает при считывании из файла код ошибки -1073741819