相关函数介绍
在我们的C语言中读写二进制文件一般使用的fread、fwrite全局函数,当然也可以使用更底层的read和write函数。在我们的
C++中 通过ofstream 和 ifstream 对象 读写文件更加的方便了
。对二进制文件的读写 主要使用
ofstream::write,ifstream::read函数
。如果对文件读写方向感不强,记不住的 ,记住4个字就行了。
读入写出。这个4个字是针对 程序或者说是内存!往内存里面读数据 -> read ,往磁盘里面写数据->write
。这样永远就会忘了。还有一些其他的函数,都比较简单。感觉用起来很方便。
这里普及下
序列化和反序列化
。
序列化: 将数据结构或对象转换成二进制串的过程。
反序列化:将在序列化过程中所生成的二进制串转换成数据结构或者对象的过程。
下面就用相关函数实现普通的字符文件操作 和 二进制文件操作。代码注释很详细
普通文件操作
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <fstream>
using namespace std;
//写文件
void WriteFile()
ofstream file("./text.txt",ios::out);
if (!file.is_open())
cout << "文件打开失败" << endl;
return;
file << "姓名:laymond" << endl;
file << "年龄:18" << endl;
file.close();
return;
//读文件
void ReadFile()
ifstream file("./text.txt", ios::in);
if (!file.is_open())
cout << "文件打开失败" << endl;
return;
char temp[1024] = { 0 };
//读取文件3种方式
//1、read file.eof() 作为判断条件 会慢一拍
while (file >> temp)
//while (!file.eof())
//file.read(temp, 1024); //这样会读取到\n
//cout << temp
// >>按行读取,不会读换行符
cout << temp << endl;
//2、get 一个一个字符的读取
//char c;
//while ( (c=file.get()) != EOF )
// cout << c;
//3、一行一样读取 getline 会把\n 舍弃掉....
//while (file.getline(temp,1024))
// cout << temp << endl;
file.close();
二进制文件操作(序列化和反序列化)
接上面代码哈,是写在同一个文件中的。
class Person
public:
Person(char* name, int age)
strcpy(this->name, name);
this->age = age;
void showInfo()
cout << name << " " << age << endl;
public:
char name[10]{ 0 };
int age = 0;
//二进制文件 进行写
void WriteBinaryFile()
ofstream file("./binary.txt",ios::out | ios::binary );
if (!file.is_open())
cout << "文件打开失败" << endl;
Person p1("Lay1", 11);
Person p2("Lay2", 2);
Person p3("Lay3", 151);
Person p4("Lay4", 5);
Person p5("Lay5", 9);
file.write((char*)&p1, sizeof(p1));
file.write((char*)&p2, sizeof(p2));
file.write((char*)&p3, sizeof(p3));
file.write((char*)&p4, sizeof(p4));
file.write((char*)&p5, sizeof(p5));
file.close();
//二进制文件 进行读
void ReadBinaryFile()
ifstream file("./binary.txt", ios::in | ios::binary);
if (!file.is_open())
cout << "文件打开失败" << endl;
//开辟一块空间 存放读取的数据
char* temp = new char[sizeof(Person)];
//或者 Person p;开辟的空间肯定合适
//将数据读入的 temp对应的空间
while (file.read(temp,sizeof(Person)))
Person p = *(Person*)(temp);
p.showInfo();
file.close();
int main(int argc, char *argv[])
//读写 字符文件
//WriteFile();
//ReadFile();
//读写 二进制文件
//WriteBinaryFile();
ReadBinaryFile();
return EXIT_SUCCESS;
运行结果验证
相关函数介绍在我们的C语言中读写二进制文件一般使用的fread、fwrite全局函数,当然也可以使用更底层的read和write函数。在我们的C++中 通过ofstream 和 ifstream 对象 读写文件更加的方便了。对二进制文件的读写 主要使用ofstream::write,ifstream::read函数。如果对文件读写方向感不强,记不住的 ,记住4个字就行了。读入写出。这个4个字是针...
一.什么是对象序列化?
对象序列化是指将对象的状态转换为字符串(来自我这菜鸟的理解,好像有些书上也是这么说的,浅显易懂!);
序列化(Serialization)是将对象的状态信息转换为可以存储或传输的形式的过程(来自“百度百科—序列化“,学术性强,略显高端);
二.为什么会有对象序列化?
世间万物,都有其存在的原因。为什么会有对象序列化呢?因为程序猿们需要它。既然是对象序列化,那我们就先从一个对象说起:
var obj = {x:1, y:2};
当这句代码运行时,对象obj的内容会存储在一块内存中,而obj本身存储的只是这块内存的地址的映射而已。简单的说,对象obj就是
Visual C++源代码 124 如何以二进制格式序列化数据集Visual C++源代码 124 如何以二进制格式序列化数据集Visual C++源代码 124 如何以二进制格式序列化数据集Visual C++源代码 124 如何以二进制格式序列化数据集Visual C++源代码 124 如何以二进制格式序列化数据集Visual C++源代码 124 如何以二进制格式序列化数据集Visual C++源代码 124 如何以二进制格式序列化数据集Visual C++源代码 124 如何以二进制格式序列化数据集Visual C++源代码 124 如何以二进制格式序列化数据集Visual C++源代码 124 如何以二进制格式序列化数据集Visual C++源代码 124 如何以二进制格式序列化数据集Visual C++源代码 124 如何以二进制格式序列化数据集Visual C++源代码 124 如何以二进制格式序列化数据集Visual C++源代码 124 如何以二进制格式序列化数据集Visual C++源代码 124 如何以二进制格式序列化数据集Visual C++源代码 124 如何
当两个进程在进行远程通信时,彼此可以发送各种类型的数据。无论是何种类型的数据,都会以二进制序列的形式在网络上传送。发送方需要把这个Java对象转换为字节序列,才能在网络上传送;接收方则需要把字节序列再恢复为Java对象。
把Java对象转换为字节序列的过程称为对象的序列化。
把字节序列恢复为Java对象的过程称为对象的反序列化。
对象的序列化主要有两种用途:
1)把对象的字节序列地保存到硬盘上,通常存放在一个文件中;
2)在网络上传送对象的字节序列。
一、JDK类库中的序列化API
java.io.ObjectOutputStream代表
与Java语言一样,JavaScript中可以对对象进行序列化和反序列化,藉此对对象进行保存。ECMAScript 5标准中,JavaScript中的对象序列化是通过JSON.stringify()来实现的,而反序列化则通过JSON.parse()来实现:
代码如下:
var o = {x:1, y:29, z:42};
var s = JSON.stringify(o);
console.log(s);//{“x”:1,”y”:29,”z”:42}
var c = JSON.parse(s);
console.log(c);//Object {x=1, y=29, z=42}
1.Kapok的特点
简单,易用,header-only,只需要引用Kapok.hpp即可;高效,初步测试性和messagepack相当。
它是纯c++11实现,因此需要支持C++11的编译器。
2.主要功能
对对象进行自动化的序列化和反序列化,用起来非常简单,先来看个序列化/反序列化一个tuple的例子吧。
//序列化
Serializer sr;
auto tp = std::make_tuple(10, 12, string("test"));
sr.Serialize(tp, "tuple");
//反序列
★文件流
文件操作是最简单最直接也是最容易想到的一种方式,我们说的文件操作不仅仅是通过FileInputStream/FileOutputStream这么“裸”的方式直接把数据写入到本地文件(像我以前写的一个扫雷的小游戏JavaMine就是这样保存一局的状态的),这样就比较“底层”了。
主要类与方法和描述
1.FileInputStream.read()...
C#中的序列化主要是通过一个格式化工具获取某个自定义类型对象中的所有数据成员并写入传入的一个文件流中,或者从文件流对象中
解析出某个自定义类型对象中的所有数据成员并赋值到一个该类型对象中。从而实现了用二进制流来处理对象的存储问题。
其中C#里的格式化工具可以分为BinaryFormatter(二进制格式化工具)、SoapFormatter
// 将结构体序列化为字节数组
void serialize(Student* student, char* buffer, int size) {
if (size < sizeof(Student)) {
printf("buffer size is too small\n");
return;
memcpy(buffer, student, sizeof(Student));
// 将字节数组反序列化为结构体
void deserialize(Student* student, char* buffer, int size) {
if (size < sizeof(Student)) {
printf("buffer size is too small\n");
return;
memcpy(student, buffer, sizeof(Student));
int main() {
// 创建一个结构体实例
Student stu = {"Tom", 20, 90.5};
// 将结构体序列化为字节数组
char buffer[sizeof(Student)];
serialize(&stu, buffer, sizeof(buffer));
// 将字节数组反序列化为结构体
Student newStu;
deserialize(&newStu, buffer, sizeof(buffer));
// 输出反序列化后的结构体
printf("name: %s, age: %d, score: %lf\n", newStu.name, newStu.age, newStu.score);
return 0;
在上面的示例中,我们定义了一个名为 `Student` 的结构体,并且实现了 `serialize` 和 `deserialize` 函数。`serialize` 函数将 `Student` 结构体转换为字节数组,`deserialize` 函数将字节数组转换为 `Student` 结构体。
在 `main` 函数中,我们创建了一个 `Student` 实例,并且将其序列化为字节数组。然后,我们将字节数组反序列化为一个新的 `Student` 结构体,并输出其成员变量的值。
需要注意的是,序列化和反序列化的过程中,需要保证字节数组的大小足够存储结构体的数据。否则,可能会出现内存访问错误。