C++ 用c+编写二进制文件+;
我为学生开设了一个班级。这是一节课C++ 用c+编写二进制文件+;,c++,file,binary,writing,C++,File,Binary,Writing,我为学生开设了一个班级。这是一节课 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 stud
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;
}
如果我写入对象s的值,那么写入文件的值是什么。是否仅为rollno、marks和name(仅限数据成员?)。现在我想为fstream添加一个成员。添加成员后,如果我写入文件,哪些数据将写入文件(fstream值也会写入文件吗?)
写入文件的值是什么。只有罗尔吗?不,马克和
名称(仅限数据成员?)
在您的情况下-是的,因为该类没有vtable或家长
如果我写入文件,哪些数据将写入文件(将
fstream值是否也写入文件?)
对fstream
值对您来说毫无意义,但它们将被写入。但是,如果您以相同的方式读取存储值,对象将变得不可用,因为fstream可能包含句柄、指针等数据,这些数据在第二次运行时将无效
此方法还存在二进制兼容性问题—每次添加或更改类成员时,以前保存的数据都会变得不可用
写入文件的值是什么。只有罗尔吗?不,马克和
名称(仅限数据成员?)
在您的情况下-是的,因为该类没有vtable或家长
如果我写入文件,哪些数据将写入文件(将
fstream值是否也写入文件?)
对fstream
值对您来说毫无意义,但它们将被写入。但是,如果您以相同的方式读取存储值,对象将变得不可用,因为fstream可能包含句柄、指针等数据,这些数据在第二次运行时将无效
此方法还存在二进制兼容性问题-每次添加或更改类成员时,以前保存的数据都会变得不可用。我不确定是否理解您的问题,但如果您添加了数据成员
fstream foo代码>在学生的班级中姓名
之后,该成员也将被写入。但是,编写fstream
通常没有意义,因为(至少在Unix系统上)打开的文件在进程结束后不会保持打开状态。你应该问问自己,当你再次阅读这些数据时会发生什么(以及你将如何阅读)。阅读你用这种方式编写的fstream
,毫无意义
当新手写二进制数据时,通常是一个错误。关键是二进制数据非常脆弱。例如,在您的示例中,您可能稍后希望将名称[20]
的大小增加到某个更高的值(例如名称[32]
),因为您认为有些人的名字很长。如果您这样做了,并且您已经以二进制形式编写了学校的所有数据(当应用程序使用name[20]
),那么您将无法在名称已增长到name[32]
的应用程序中读回(没有编码转换例程)
这就是为什么通常值得使用更高级别的工具(例如MySQL之类的数据库)或使用or等标准以文本形式表示持久数据的原因。当然它也有缺点:读写数据对代码来说更复杂,执行起来也更慢。但是文本数据更容易调试,作为程序员,您可以使用普通编辑器查看它。我不确定是否理解您的问题,但是如果您添加一个数据成员fstream foo代码>在学生的班级中姓名
之后,该成员也将被写入。但是,编写fstream
通常没有意义,因为(至少在Unix系统上)打开的文件在进程结束后不会保持打开状态。你应该问问自己,当你再次阅读这些数据时会发生什么(以及你将如何阅读)。阅读你用这种方式编写的fstream
,毫无意义
当新手写二进制数据时,通常是一个错误。关键是二进制数据非常脆弱。例如,在您的示例中,您可能稍后希望将名称[20]
的大小增加到某个更高的值(例如名称[32]
),因为您认为有些人的名字很长。如果您这样做了,并且您已经以二进制形式编写了学校的所有数据(当应用程序使用name[20]
),那么您将无法在名称已增长到name[32]
的应用程序中读回(没有编码转换例程)
这就是为什么通常值得使用更高级别的工具(例如MySQL之类的数据库)或使用or等标准以文本形式表示持久数据的原因。当然它也有缺点:读写数据对代码来说更复杂,执行起来也更慢。但是文本数据更容易调试,作为程序员,您可以使用普通编辑器查看它。我认为您首先要实现的是类实例的序列化
问题及其答案可能有助于实现这一目的。
尤其是在C++中对FAQ进行序列化时,这是值得考虑的。 < P>我想首先要实现的是类实例的<强>序列化< /强>。
问题及其答案可能有助于实现这一目的。
尤其是在C++中对FAQ的FAQ提供了一个值得考虑的问题。 < P>在注释中提到的库是一个使用可扩展哈希和类似于UNIX DBM标准的数据库函数的GNU库;它管理键(任意字节的任意序列)与值(同样,任意字节的任意序列)的索引关联
除了使用JSON、XML或YAML等文本序列化格式之外,您还可以使用c