2011-11-02 48 views
1

我创造了学生的类。这是班级。书面二进制文件在C++中

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; 
} 

如果我写入对象的值,写入文件的值是什么。它只是滚动,标记和名称(仅限数据成员?)。现在我想为fstream添加一个成员。加入会员后,如果我写的文件,什么数据写入到文件(将fstream的值也写入文件?)

回答

2

什么是写入到文件中的值。它只是rollno,标记和 名称(仅限数据成员?)。

在你的情况 - 是的,因为班级没有vtable或父母。

如果我写的文件,什么数据写入到文件(将 fstream的值也写入文件?)

是。 fstream的价值观对你来说是完全没有意义的,但它们会被写出来。但是,如果将读取存储的值相同的方式,对象将变得不可用,因为fstream的可能含有句柄,指针等等 - 这不会是在第二次运行有效数据。

这种方法也有二进制的兼容性问题 - 每次添加或更改类成员时,您以前保存的数据变得不可用。

1

我不知道理解你的问题,但如果你在你的class student该成员name后添加一个数据成员fstream foo;也将被写入。但是,编写fstream通常没有意义,因为(至少在Unix系统上)打开的文件在进程结束后不会保持打开状态。你应该问问自己,当你再读这些数据时会发生什么(以及如何阅读它)。读你用这种方式写的fstream是没有意义的。

和写入二进制数据通常是当一个新手做了一个错误。关键是二进制数据非常脆弱。例如,在你的榜样,你以后可能要到name[20]的规模增长到一些较高的值(例如name[32]),因为你的身影,有些人有很长的名字。如果你这样做了,并且如果你已经以二进制形式写入了你学校的所有数据(当应用程序使用name[20]时),你将无法使用名称增长的应用程序将其读回(没有编码转换例程)到name[32]

这就是为什么它通常是值得要么使用一些更高级别的工具(例如,像MySQL数据库),或表示以文本形式持久数据,用标准,如XMLJSON或或YAML。当然它有缺点:读取数据对于代码更复杂,执行速度更慢。但是文本数据更容易调试,因为程序员可以用普通的编辑器查看它。

+0

“文本数据更容易调试,作为一个程序员,你可以用普通的编辑器查看” 如果我作为文本数据存储它很难更新记录,并从文件中删除记录。我可以在文本文件中使用随机访问方法吗? – Heartly

+0

不,您不能在文本文件上轻松使用随机访问。但是,您可以将所有文本文件加载到内存中(如果您的数据不是很大,这是可行的),然后在内存中运行并最终转储文本文件。您也可以使用数据库或(在简单情况下)索引文件,如GDBM。但不要忘记,二进制数据是脆弱的! –

+0

不,我们不关心使用关系数据库系统。我们的后端只有平面文件。那么ISAM呢?无论GDBM是软件还是哈希表等概念? – Heartly

4

我想你想在第一时间获得什么是类实例的系列化

This问题及其答案可能对此有所帮助。 特别是这个link(提供的评分最高的答案)在C++序列化常见问题解答中可能值得考虑。

+0

谢谢!我会读这一切。 – Heartly

0

GDBM库我的评论中提到的是使用可扩展散列和工作方式与标准UNIX DBM数据库功能的GNU库;它管理关键字(任意字节的任意序列)到值的索引关联(类似地,任意字节的任意序列)。

我除了用文字序列化格式,如JSON,XML或YAML的,你可以使用C++的序列化库像s11n