Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用c+编写二进制文件+;_C++_File_Binary_Writing - Fatal编程技术网

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