用c ++编写二进制文件

时间:2011-11-02 07:21:57

标签: 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 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值是否也会写入文件?)

4 个答案:

答案 0 :(得分:4)

我认为您首先想要实现的是类实例的序列化

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

答案 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这样的数据库)或使用XMLJSON等标准来表示文本形式的持久数据的原因。 YAML。当然它确实有缺点:阅读和阅读编写数据对代码来说更复杂,执行起来也更慢。但是文本数据更容易调试,作为程序员,您可以使用普通编辑器进行查看。

答案 3 :(得分:0)

我在评论中提到的GDBM库是一个GNU数据库函数库,它使用可扩展的散列并且工作类似于标准的UNIX dbm ;它管理键的索引关联(任意字节的任意序列)与值(同样,任意字节的任意序列)。

我添加了使用文本序列化格式(如JSON,XML或YAML),您可以使用C ++序列化库,如s11n