#include <cstdlib>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
class PERSON{
string name, surname;
public:
void set_name(string aname, string asurname){
name = aname;
surname = asurname;
};
void read(){
}
void output(){
cout << name << " " << surname << "\n";
}
void save(PERSON *x){
ofstream file("test.bin", ios::out | ios::app | ios::binary);
if(!file.is_open()){
cout << "ERROR\n";
}else{
file.write((char*)x, sizeof(*x));
file.close();
}
}
};
/*
*
*
*
*/
int main(int argc, char** argv) {
PERSON * person1 = new PERSON;
PERSON * person2 = new PERSON;
person1->set_name("Amon", "Raa");
person1->save(oseba1);
ifstream file2("test.bin", ios::in | ios::binary);
if(!file2.is_open()){
cout << "Error\n";
return 0;
}
while(!file2.eof()){
file2.read((char *)person2, sizeof(*person2));
person2->output();
}
file2.close();
return 0;
}
这是我的代码......我做错了什么? 我想要做的是每次将一个类保存到二进制文件的末尾,然后读取所有条目......
但每次我运行程序时,我只会打印最后输入的名称
所以第一次运行它 文件写得正确,输出正常 然后我将名称更改为其他名称,让我们说John Doe,我得到2次John Doe的输出
请帮助......我是一个完全的初学者;(
答案 0 :(得分:1)
类的序列化例如包含在boost包中。
http://www.boost.org/doc/libs/1_53_0/libs/serialization/doc/index.html
我认为您实际上并不想自己实现这些功能。
答案 1 :(得分:1)
你不能简单地用C ++写出一个类的二进制图像,尤其是包含指针和非POD成员的二进制图像。一旦你有数据的间接性,简单地写出一个内存图像是行不通的,因为只写出该类的内存图像不包括指向的数据,因为为了使这个工作你的工作你必须将包括指向数据在内的所有数据加载到保存它们时所处的完全相同的内存位置。这是不容易的(温和地说)。
您有两种选择,一种是手动,一种是使用第三方库:
1)你用一堆簿记信息分别编写和阅读每个成员。这应该适用于你的情况,因为你真正需要加载和保存的是两个字符串的内容及其各自的长度
2)另一个选项 - 特别是当数据结构比你正在使用的数据结构更复杂时 - 是使用类似boost::serialization的东西来为你做咕噜咕噜的工作。
答案 2 :(得分:0)
您必须使用类PERSON的指针数组。然后从二进制文件中读取并填充数组。
ifstream input("PERSON.std",ios::binary);
input.seekg(0, ios::end);
int count = input.tellg() / sizeof(PERSON);
PERSON *persons = new PERSON[count];
input.seekg(0, ios::beg);
input.read((char*) persons, sizeof(PERSON)*count);
cout << count << endl;
for (int j = 0; j < count; j++)
{
cout << count << endl;
cout <<persons[j].output() << "\n";
}
cout << '\n';
input.close();