beginer_38
(Programmer in future)
17.Сентябрь.2020 09:16:49
#1
Добрый день! Подскажите пожалуйста как вот такую запись проделать в векторе:
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);
}
beginer_38
(Programmer in future)
17.Сентябрь.2020 09:18:43
#2
Вот, что я пытаюсь реализовать вообще:
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;
beginer_38
(Programmer in future)
18.Сентябрь.2020 07:23:49
#4
Вроде разобрался, спасибо. Теперь не могу понять, почему если номер контакта 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;
}
}
AlexP
(Alex P.)
18.Сентябрь.2020 08:25:28
#5
Тут один элемент зачем-то записывается столько раз, сколько сейчас элементов в списке.
Так это список контактов или список телефонных книг?)
beginer_38
(Programmer in future)
18.Сентябрь.2020 08:27:06
#6
Ну у меня класс книга, а это вектор из объектов этого класса
AlexP
(Alex P.)
18.Сентябрь.2020 08:30:13
#7
Так значит это список телефонных книг?
Тут так написано:
beginer_38:
vector<Phone_book>
beginer_38
(Programmer in future)
18.Сентябрь.2020 08:32:46
#8
И что нужно сделать?
class Phone_book
{
static int s_id;
int id = 0;
string name;
string surname;
string adds;
string number;
AlexP
(Alex P.)
18.Сентябрь.2020 08:41:37
#9
Не называть контакт телефонной_книгой )
beginer_38
(Programmer in future)
18.Сентябрь.2020 08:47:32
#12
Сделать еще один класс книга с полем вектор?
beginer_38
(Programmer in future)
18.Сентябрь.2020 08:51:51
#13
Я не понимаю, что вы имеете в виду. Именно этого я не могу понять, почему так происходит:
AlexP
(Alex P.)
18.Сентябрь.2020 08:56:48
#14
Этот переименовать для начала.
beginer_38:
почему так происходит
Как написано, так и происходит.
beginer_38
(Programmer in future)
18.Сентябрь.2020 09:00:25
#15
Вот дурак! Теперь понял, спасибо))
beginer_38
(Programmer in future)
18.Сентябрь.2020 10:11:50
#16
Помогите тогда уже с чтением из файла и последующим выводом на экран. Я сделал так, но это не очень красиво получается. Хочется, чтобы оно выглядело как и в файле.
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()? Так оно заработает?
AlexP
(Alex P.)
18.Сентябрь.2020 10:29:37
#17
getline
чтобы читать всю строку.
while (getline(fs, s)) {
cout << s << endl;
}
beginer_38
(Programmer in future)
18.Сентябрь.2020 12:51:46
#18
Почему оно не работает и программа вылетает с ошибкой, хоть и выводит содержимое на экран?
Вот так происходит добавление контакта и его запись в файлы (бинарный и текстовый):
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();
}
AlexP
(Alex P.)
18.Сентябрь.2020 13:10:47
#19
Вылетает где и с какой ошибкой?
beginer_38
(Programmer in future)
18.Сентябрь.2020 13:12:48
#20
Вылетает при считывании из файла код ошибки -1073741819