用c++写二进制文件
writing in binary file in c++
我已经为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 student
中name
之后添加数据成员fstream foo;
,该成员也将被写入。然而,编写fstream
通常是没有意义的,因为(至少在Unix系统上)打开的文件在进程结束后不会保持打开状态。您应该问问自己,当您再次读取该数据时会发生什么(以及您将如何读取它)。你这样写的fstream
是没有意义的。
新手写二进制数据通常是一个错误。关键是二进制数据非常脆弱。例如,在您的示例中,您可能稍后希望将name[20]
的大小增加到某个更大的值(例如name[32]
),因为您认为有些人的名字非常长。如果您这样做了,并且如果您已经将学校的所有数据以二进制形式写入(当应用程序使用name[20]
时),那么您将无法使用名称已增长为name[32]
的应用程序读取它(没有编码转换例程)。
这就是为什么通常值得使用一些更高级别的工具(例如像MySQL这样的数据库)或使用像XML或JSON或YAML这样的标准以文本形式表示持久数据。当然它也有缺点:阅读&编写数据对代码来说更复杂,执行起来也更慢。但是文本数据更容易调试,作为程序员,您可以使用普通编辑器查看它。
- 正在读取二进制文件(is_open)
- 在C++中将类(带有Vector成员)保存为二进制文件
- 如何从二进制文件中读取字符串
- 保存/加载大量短数组到二进制文件
- 从二进制文件中读取整数数组
- Android 在编译二进制文件时重建静态库
- 在 C++ 中将双精度变量写入二进制文件
- clang 的 libFuzzer 可以在同一二进制文件中测试超过 1 个 API 吗?
- C++:实际上不是从二进制文件中读取
- 如何从二进制文件中的给定符号中获取调用程序图
- 将内部带有矢量的结构保存/读取到二进制文件中
- 编译多个C++文件.调用二进制文件以运行代码
- 如何使用位字段将数据从二进制文件复制到结构中?
- uint8_t同一二进制文件的不同十进制值
- C++单个生成文件多个二进制文件
- 尝试将数字写入二进制文件时引发异常
- C++中读/写二进制文件
- 如何忽略某些二进制文件的执行?
- 对在不同二进制文件中创建的对象文件的依赖关系
- 我的 SDL2 程序需要哪些二进制文件,以便它在另一台未安装 SDL2 的计算机中工作