c(stl)实现的修改游戏存档文件的2个相关类

上传人:xiao****1972 文档编号:84136694 上传时间:2019-03-02 格式:DOC 页数:14 大小:57KB
返回 下载 相关 举报
c(stl)实现的修改游戏存档文件的2个相关类_第1页
第1页 / 共14页
c(stl)实现的修改游戏存档文件的2个相关类_第2页
第2页 / 共14页
c(stl)实现的修改游戏存档文件的2个相关类_第3页
第3页 / 共14页
c(stl)实现的修改游戏存档文件的2个相关类_第4页
第4页 / 共14页
c(stl)实现的修改游戏存档文件的2个相关类_第5页
第5页 / 共14页
点击查看更多>>
资源描述

《c(stl)实现的修改游戏存档文件的2个相关类》由会员分享,可在线阅读,更多相关《c(stl)实现的修改游戏存档文件的2个相关类(14页珍藏版)》请在金锄头文库上搜索。

1、C+(STL)实现的修改游戏存档文件的2个相关类.txt两个人吵架,先说对不起的人,并不是认输了,并不是原谅了。他只是比对方更珍惜这份感情。C+(STL)实现的修改游戏存档文件的2个相关类 收藏 /本类可自动检查游戏存档中的数值/属于模板类/T代表要寻找数据的类型/如金钱,生命等属于整型/但不排除以后要查找其他类型的数据。为了可扩充性,使用了模板。template class CheckBinaryFile public: typedef fstream:off_type AddressType;/要找的数据在文件中的地址类型 CheckBinaryFile();/构造函数 void Run(

2、); private: static const int MaxByte=sizeof(T);/要查找的数据的类型所占的字节数 const int CharSize; EInputStream CIN;/一个加强输入流(第三方类) string FileName;/文件名称 T OldData;/输入的要查找的数据 int ByteNumber;/要查找的数据所占的字节数 /mutable关键字是const的反义作用,容易变动的变量经常使用它 mutable bool InputIsOk; /用于读的文件对象 mutable ifstream BinaryFile; mutable list

3、AddressList; /操作方法 void Input(); int Check() const; void SaveAddressToFile(ostream&) const;/最后的const作用是防止修改本类对象的状态,即除mutable关键字标识的变量外其他都不可在此函数内做修改 void AutoModifySave(const T&) const;/在函数内防止修改T类型的参数;template /如果是static声明的静态变量在类体内做了声明,则在类外必须再做定义,而且只能被声明一次const int CheckBinaryFile:MaxByte;/源文件/构造函数tem

4、plate CheckBinaryFile:CheckBinaryFile():CharSize(char),CIN(cin) InputIsOk=true; Input(); /CharSize 为sizeof(char),把cin 绑定到CIN。由于CharSize是常量,必须在构造函数的初始化列表中设定。/私有函数:输入成员函数template void CheckBinaryFile:Input() /打开指定的输入文件名的二进制文件 coutFileName; BinaryFile.open(FileName.c_str(),ios:in|ios:binary); if(!Binar

5、yFile) InputIsOk=false; cerropen file failed!n; return; /输入要查找的数据 coutOldData; /要找的数据的所占的数据位(字节数) coutbyte number:(1-CheckBinaryFile:MaxByteByteNumber; /字节数是否溢出的检查 if(ByteNumberCheckBinaryFile:MaxByte) ByteNumber=CheckBinaryFile:MaxByte; / coutByte number was amended to ByteNumberendl; coutByte numb

6、er was amended to CheckBinaryFile:ByteNumberendl;/? /私有函数:检查输入的二进制文件中有多少个OldData,并保存地址到list链表对象中/memory.htemplate int CheckBinaryFile:Check() const /将数据地址转换为字符串地址 const char* p=reinterpret_cast(&OldData); char RangeCheckBinaryFile:MaxByte; int Occurs=0; AddressType Addr=0; /填充0 memset(Range,0,CheckB

7、inaryFile:MaxByte*CharSize); BinaryFile.read(Range,CharSize*ByteNumber);/填满Range /如果读文件成功 while(BinaryFile) if(memcmp(p,Range,CharSize*ByteNumber)=0) AddressList.push_back(Addr); +Occurs; /删除一个最旧的 memcpy(Range,&Range1,CharSize*(ByteNumber-1); /读最新 BinaryFile.read(&RangeByteNumber-1,CharSize); +Addr;

8、 /返回匹配数量 return Occurs;/私有函数:保存找到的地址到文件template void CheckBinaryFile:SaveAddressToFile(ostream& os) const copy(AddressList.begin(),AddressList.end(),ostream_iterator(os,t);/私有函数:保存修改结果分别为一个文件template void CheckBinaryFile:AutoModifySave(const T& NewValue) const list:const_iterator Beg=AddressList.beg

9、in(),End=AddressList.end(); const char *p=reinterpret_cast(&NewValue); for(;Beg!=End;+Beg) /每个地址都要重新开头读 BinaryFile.clear();/清除错误状态 BinaryFile.seekg(0,ios:beg);/指向文件开头,准备读取 AddressType Addr=0; char ch; stringstream NewFile; NewFile*Beg; string NewFileName(NewFile.str(); ofstream Write(NewFileName.c_s

10、tr(),IOS:out|IOS:binary); /文件对象错误 if(!Write) cerrNewFileName Failed!n; continue; while(Addr*Beg&BinaryFile) /小于地址内容 BinaryFile.read(&ch,CharSize); Write.write(&ch,CharSize); +Addr; for(int k=0;kByteNumber;+k) BinaryFile.read(&ch,CharSize); Write.write(p,CharSize*ByteNumber); while(BinaryFile) Binary

11、File.read(&ch,CharSize); Write.write(&ch,CharSize); Write.close(); coutNewFileName.successfully.n; /下次循环的时候文件已经成为bad状态,要清除这个状态 /for /公有函数:void Run();template void CheckBinaryFile:Run() if(InputIsOk=false) return; /查找到的地址数量 const int Occurs=Check(); coutOccurs different address were found!n; /没有找到内存地址,返回 if(Occurs=0) r

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 大杂烩/其它

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号