用c++写二进制文件

writing in binary file in c++

本文关键字:二进制文件 c++      更新时间:2023-10-16

我已经为student创建了一个类。这就是班级

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值也写入文件吗?)

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

这个问题及其答案可能有助于这个目的。特别是这个关于c++序列化的常见问题解答的链接(在那里提供了评分最高的答案)可能值得您考虑。

写入文件的值是什么?只有罗诺,马克和吗name(仅限数据成员).

在你的例子中-是的,因为类没有变量表或父类。

如果我写一个文件,什么数据会写入文件(将Fstream值也写入文件?)

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

这个方法还存在二进制兼容性问题——每次添加或更改类成员时,以前保存的数据将无法使用。

我不确定是否理解您的问题,但如果您在class studentname之后添加数据成员fstream foo;,该成员也将被写入。然而,编写fstream通常是没有意义的,因为(至少在Unix系统上)打开的文件在进程结束后不会保持打开状态。您应该问问自己,当您再次读取该数据时会发生什么(以及您将如何读取它)。你这样写的fstream是没有意义的。

新手写二进制数据通常是一个错误。关键是二进制数据非常脆弱。例如,在您的示例中,您可能稍后希望将name[20]的大小增加到某个更大的值(例如name[32]),因为您认为有些人的名字非常长。如果您这样做了,并且如果您已经将学校的所有数据以二进制形式写入(当应用程序使用name[20]时),那么您将无法使用名称已增长为name[32]的应用程序读取它(没有编码转换例程)。

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