我为学生创建了一个班级。这是班级。
class student
{
int rollno,marks;
char name[20];
public:
void show();
void get();
int filecreate(const string &,fstream &);
int fileopen(const string &,fstream &);
static int add(const student &,fstream &);
static int read(const student &,fstream &,int);
static int update(const student &,fstream &,int);
int showall(fstream &);
int view(fstream &,int );
int adddummy(fstream &);
};
这是我在二进制文件中写入记录的add方法。
int student::add(const student &s,fstream &fp)
{
fp.seekp(0, ios::end);
if(fp.write((char*)&s,sizeof s))
return 1;
return 0;
}
如果我写了对象的值,那么写入文件的值是什么。它只是rollno,标记和名称(仅限数据成员?)。现在我想为fstream添加一个成员。添加成员后,如果我写了文件,哪些数据会写入文件(fstream值是否也会写入文件?)
答案 0 :(得分:4)
答案 1 :(得分:2)
写入文件的值是什么。它只是rollno,标记和 名称(仅限数据成员?)。
在你的情况下 - 是的,因为班级没有vtable或父母。
如果我写了文件,会写入文件的数据是什么(将... fstream值也写入文件?)
是。 fstream
值对你来说完全没有意义,但它们将被写入。但是,如果您将以相同的方式读取存储的值,则该对象将变得不可用,因为fstream可能包含句柄,指针等 - 在第二次运行时无效的数据。
此方法也存在二进制兼容性问题 - 每次添加或更改类成员时,先前保存的数据都将无法使用。
答案 2 :(得分:1)
我不确定您是否理解您的问题,但如果您在fstream foo;
name
之后添加数据成员class student
,该成员也会被写入。但是,编写fstream
通常是没有意义的,因为(至少在Unix系统上)打开的文件在进程结束后不会保持打开状态。您应该问自己,当您再次阅读该数据时会发生什么(以及您将如何阅读它)。阅读你用这种方式写的fstream
是毫无意义的。
当新手完成时,写二进制数据通常是个错误。关键是二进制数据非常脆弱。例如,在您的示例中,您稍后可能希望将name[20]
的大小增加到更高的值(例如name[32]
),因为您认为某些人的名字很长。如果你这样做,并且如果你已经以二进制形式为学校写了所有数据(当应用程序使用name[20]
时),你将无法用应用程序读回它(没有编码转换例程)名称已增长到name[32]
。
这就是为什么通常使用某些更高级别的工具(例如像MySQL这样的数据库)或使用XML或JSON等标准来表示文本形式的持久数据的原因。 YAML。当然它确实有缺点:阅读和阅读编写数据对代码来说更复杂,执行起来也更慢。但是文本数据更容易调试,作为程序员,您可以使用普通编辑器进行查看。
答案 3 :(得分:0)