Linux高级编程实验实验2报告.docx

上传人:b****6 文档编号:8313286 上传时间:2023-01-30 格式:DOCX 页数:13 大小:601.49KB
下载 相关 举报
Linux高级编程实验实验2报告.docx_第1页
第1页 / 共13页
Linux高级编程实验实验2报告.docx_第2页
第2页 / 共13页
Linux高级编程实验实验2报告.docx_第3页
第3页 / 共13页
Linux高级编程实验实验2报告.docx_第4页
第4页 / 共13页
Linux高级编程实验实验2报告.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

Linux高级编程实验实验2报告.docx

《Linux高级编程实验实验2报告.docx》由会员分享,可在线阅读,更多相关《Linux高级编程实验实验2报告.docx(13页珍藏版)》请在冰豆网上搜索。

Linux高级编程实验实验2报告.docx

Linux高级编程实验实验2报告

电子科技大学

实验报告

学生姓名:

学号:

指导教师:

李林

实验地点:

清水河主楼A2-412实验时间:

2016.11.16

一、实验室名称:

Linux环境高级编程实验室

二、实验项目名称:

对象序列化实验

三、实验学时:

8学时

四、实验目的:

学习序列化原理与方法,掌握基本的序列化技巧

五、实验内容:

●版本1:

将一个类的一个对象序列化到文件

●版本2:

将一个类的多个对象序列化到文件

●版本3:

将两个类的多个对象序列化到文件

●版本4:

按照面向对象的方法,解决多个类的多个对象序列化到文件的问题

●版本5:

序列化的目的地不仅可以是文件,还可以是其他,即可配置性

六、实验步骤:

1、版本一程序分析:

源程序如下,功能是将一个类的一个对象(电话号码)序列化到文件:

#include

#include

#include

#include

classSAD//SerializeAndDeserialize

{

public:

SAD()//构造函数。

{

tel0=tel1=0;//将电话号码分成两个int变量保存。

}

explicitSAD(longintm,longintk)

{

tel0=m;tel1=k;

}

virtual~SAD()

/*使用虚析构。

在析构时防止只析构基类而不析构派生类的状况发生,造成内存泄漏。

*/

{

}

public:

voidreshow()//用于打印出变量的值。

{

std:

:

cout<<"TELofrecovery:

"<

:

endl;

}

public:

voidshow()//用于打印出电话的值。

{

std:

:

cout<<"TELbeforeSerialize:

"<

:

endl;

}

public:

boolxuliehua(constchar*lujing)const

/*非静态成员函数后面加了const的成员函数可以被非const对象和const对象调用。

*/

{

intfd=:

:

open(lujing,O_RDWR|O_CREAT|O_TRUNC,0);

/*open函数位于fcntl.h中。

open函数用于打开和创建文件。

pFilePath表示文件名,参数O_RDWR表示以可读写方式打开文件.O_CREAT表示若欲打开的文件不存在则自动建立该文件.O_TRUNC表示若文件存在并且以可写的方式打开时,此旗标会令文件长度清为0,而原来存于该文件的资料也会消失.若所有欲核查的权限都通过了检查则返回0值,表示成功,只要有一个权限被禁止则返回-1.*/

if(-1==fd)

returnfalse;

if((:

:

write(fd,&tel0,sizeof(longint)))&&(:

:

write(fd,&tel1,sizeof(longint)))==-1)

/*write是用于向文件中写数据的函数。

fd只是一个整数,在open时产生。

起到一个索引的作用,进程通过PCB中的文件描述符表找到该fd所指向的文件指针filp。

从tel0的地址起,写入sizeof(longint)个字符。

*/

{

:

:

close(fd);//释放file结构体。

returnfalse;

}

if(:

:

close(fd)==-1)

returnfalse;

returntrue;

}

boolfanxuliehua(constchar*lujing)//反序列化,参数是文件名以及路径。

{

intfd=:

:

open(lujing,O_RDWR);//以读写方式打开。

if(-1==fd)

returnfalse;//打开失败。

intr=(:

:

read(fd,&tel0,sizeof(longint)))&&(:

:

read(fd,&tel1,sizeof(longint)));

if(-1==r)

{

:

:

close(fd);

returnfalse;//读失败。

}

if(:

:

close(fd)==-1)

returnfalse;

returntrue;

}

private:

longinttel0,tel1;//电话号码赋值变量。

};

intmain()

{

{

SADa(135479,35899);

a.show();//显示序列化前的电话号码。

a.xuliehua("data");//序列化。

}

{

SADa;

a.fanxuliehua("data");

a.reshow();//显示序列化后的电话号码。

}

return0;

}

执行编译并运行后的运行结果如下图1.1:

图1.1版本一序列化运行结果

流程图如下:

开始

初始化

序列化电话号码

显示数据

反序列化

显示恢复后号码

结束

图1.2版本一程序流程图

2、版本二程序分析:

部分原代码如下图2.1,功能为将一个类的多个对象序列化到文件(截图是在图形界面的虚拟终端下进行的,因为我在终端模式下查看的中文注释是乱码):

(a)头文件

(b)序列化子程序

(c)显示程序

(d)反序列化子程序

(e)主程序

图2.1版本二代码图

然后切换到终端模式,g++编译运行,得到预期结果,序列化完成。

图2.2运行结果

3、版本三程序分析:

版本三的功能是,将两个不同类的多个对象序列化到文件中。

其主函数部分代码如图3.1

图3.1主函数代码

经过g++编译运行后,得到结果如下图3.2:

图3.2运行结果

其程序流程图如下3.3:

图3.3程序流程图

4、版本四程序分析:

本程序实现了将三个不同的类的多个对象序列化到文件,采用面向对象的方法,查找变化点,抽象出需要进行序列化的基类。

当又有新的类的对象,需要序列化到文件时,不需要修改已有的代码。

其代码如下图4.1所示。

图4.1主函数代码

通过g++编译再运行得到结果如图4.2:

图4.2程序结果

5、版本五程序:

本程序的主函数如下图5.1所示:

图5.1主程序

运行结果如下图5.2所示:

图5.2运行结果

 

七、总结及心得体会:

在本次实验中:

1、我理解了序列化的内涵。

它是将对象的状态信息转换为可以存储或传输的形式的过程。

序列化时,把对象及其当前状态写入到临时或持久性存储区。

反序列化时,就可以通过从存储区中读取对象的状态,从而重新创建被存储的对象。

2、学会了基本的序列化操作,比如将一个类的一个对象序列化到文件、将一个类的多个对象序列化到文件、将两个类的多个对象序列化到文件以及按照面向对象的方法,解决多个类的多个对象序列化到文件的问题。

八、对本实验过程及方法、手段的改进建议:

此次实验整体顺利,同学们可以在课后尝试更多的序列化方法。

积极创新,提高技能。

该实验让我学到了许多实际的原理与思想。

老师讲课层层递进,给了我们充足时间练习。

 

报告评分:

指导教师签字:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 机械仪表

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1