c++存取dat数据

      众所周知,dat是一个类似加密的二进制格式文件,很多人喜欢将游戏数据保存在dat文件中,只有知道你的存放格式,才能够将数据破解出来,因而研究了dat文件的存取方式。其实就是c++文件的操作,只不过是在取的时候需要按照自己存放的格式获取出来。

本文将实现将结构体数据保存到dat文件,并且将dat文件读取回来。

1.struct结构体的格式数据
      首先定义一个结构体,用以存放存入dat文件的数据,同时,再取的时候按照结构体的格式进行获取操作:
 

#pragma once
#ifndef _STRUCT_H_
#define _STRUCT_H_#include<vector>
#include <iostream>
#include <string>
using namespace std;;
#define MaxSize 10
//设置结构体的边界对齐为1个字节,对于结构体中的char数组,如果不满4的倍数字节,会默认补齐,声明之后数据在内存中是连续存储的。
#pragma pack(1) 
typedef struct _TEST_DAT
{int type;char name[MaxSize];int age;
}TESTDAT;#pragma pack()#endif 

这时的结构体内存结构是对齐的。

2.TxtToFile存取dat文件

         先说存,首先初始化一个结构体,其次将该结构体数据依次保存到指定名字的dat文件中,如下:

TxtToFile.h:

#pragma once
#ifndef _TXT_TO_FILE_H_
#define _TXT_TO_FILE_H_
#include<vector>
#include <iostream>
#include <fstream>
#include <string>
#include "Struct.h"
#include <stdio.h>
using namespace std;
class TxtToFile
{
public:TxtToFile();~TxtToFile();//外调函数,保存到dat文件bool  SaveToDat(string _datPath);
private:TESTDAT	m_dat;fstream	m_datstream;vector<TESTDAT>	m_getdat;private:// 把基本的Number类型写入文件流中template<class T>bool Write(T value){//rem_datstream.write(reinterpret_cast<char *>(&value), sizeof(T));return true;}//把字符串写入文件流void  WriteString(string _str, int	_count);
};
#endif

TxtToFile.cpp :

#include "stdafx.h"
#include "TxtToFile.h"
#include <sstream>TxtToFile::TxtToFile()
{m_dat = TESTDAT{0,"dasdasd",1};}TxtToFile::~TxtToFile()
{
}
bool TxtToFile::SaveToDat(string _datPath)
{if (_datPath.size() == 0){return false;}m_datstream.open(_datPath, fstream::out | fstream::binary);//以二进制的形式打开文件if (!m_datstream.is_open()){cout << "open" << _datPath << "Failed" << endl;m_datstream.close();return false;}Write(m_dat.type);//存入数据WriteString(m_dat.name, MaxSize);Write(m_dat.age);//Write(m_dat);cout << "Successed" << endl;m_datstream.close();return true;
}
void TxtToFile::WriteString(string _str, int _count)
{if (_str.length()>=_count){cout << "write string error!" << endl;return;}m_datstream << _str;int len = _count - _str.length();while (len--){m_datstream << '\0';}
}

        这个时候,已经把数据存入到dat文件中,接下来就是取数据了,如下:

首先在头文件中加两个函数:

	//从dat文件读取数据bool GetFromDat(string _datPath);__int64 getFileSize(const char *filename);

cpp:

bool TxtToFile::GetFromDat(string _datPath)
{if (_datPath.size()==0){return false;}__int64 scount = 0;__int64 stuctsize = sizeof(TESTDAT);TESTDAT testdat;__int64 filesize = getFileSize(_datPath.c_str());if (filesize==0|| filesize<stuctsize ||(filesize%stuctsize)!=0){return false;}scount = filesize / stuctsize;FILE *inStream = NULL;const char* name = _datPath.c_str();inStream = fopen(name, "rb");if (inStream == NULL) return false;for (int i = 0; i < scount; i++){//size_t fread(void *ptr, size_t size, size_t n, FILE *stream);//参数ptr是保存读取的数据,void*的指针可用任何类型的指针来替换,如char*、int *等等来替换;//size是每块的字节数;n是读取的块数,如果成功,返回实际读取的块数(不是字节数),本函数一般用于二进制模式打开的文件中。fread(&testdat, stuctsize, 1, inStream);/*if (testdat.duration < 0){fclose(inStream);return false;}*/m_getdat.push_back(testdat);}fclose(inStream);return true;
}__int64 TxtToFile::getFileSize(const char *filename)
{__int64 size = 0;/*FILE *fp = fopen(filename, "rb");if (!fp){return 0;}fseek(fp, 0, SEEK_END);size = ftell(fp);fseek(fp, 0, SEEK_SET);fclose(fp);*/fstream instreams;instreams.open(filename, ios::_Nocreate);if (!instreams.is_open()){return 0;}instreams.seekg(0, ios::end);size = instreams.tellg();instreams.close();return size;
}

读的时候用的是C语言的,因为映射一下就是结构体了,而且存的时候没有存空格\n\t之类的分隔符,所以用getline不好取。

3.测试样例

main函数:

// DatTxt.cpp : 定义控制台应用程序的入口点。
//#include "stdafx.h"
#include "TxtToFile.h"int _tmain(int argc, _TCHAR* argv[])
{TxtToFile ttofile;ttofile.SaveToDat("Test.Dat");ttofile.GetFromDat("Test.Dat");return 0;
}

运行视图:

 

成功,并且能在目录下找到dat文件,如果要看取出来的数据,那么需要加断点查看咯

Over

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/54950.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

0基础入门C++之类和对象下篇

目录 1.再谈构造函数1.1构造函数赋值1.2初始化列表1.3explicit关键字 2.static成员2.1概念2.1静态成员变量2.2静态成员函数2.3特性 3.匿名对象4.友元函数4.1友元函数4.2友元类 5.内部类6.再次理解类和对象 1.再谈构造函数 首先我们先来回忆一下构造函数&#xff1a; 构造函数是…

华为OD-整数对最小和

题目描述 给定两个整数数组array1、array2&#xff0c;数组元素按升序排列。假设从array1、array2中分别取出一个元素可构成一对元素&#xff0c;现在需要取出k对元素&#xff0c;并对取出的所有元素求和&#xff0c;计算和的最小值 代码实现 # coding:utf-8 class Solution:…

【工具使用】Git的使用

dev代表开发版 1. git clone 命令 通过 git add <name> 对文件进行跟踪&#xff0c;把<name>加入到暂存区 git commit -m XXXXXXX 提交修改并补充XXXXX作为注释 “暂存”状态&#xff1a;出现了一些修改&#xff0c;但是还没有提交 对于Java来说&#xff0c;.cl…

goland 中的调试器 -- Evaluate

今天一个好朋友 找到我&#xff0c;问我关于goland中Evaluate 小计算器的使用方式&#xff0c;说实话&#xff0c;我在此之前也没用过这个东西&#xff0c;然后我就找一些相关文档&#xff0c;但是这类文档少的可怜&#xff0c;所以我就稍微研究一下&#xff0c;找找材料&#…

数组名和函数名是指针?指针和引用底层一样?

在2023/8/26日晚上&#xff0c;我看到一个所谓“典”的视频&#xff0c;一开始还没太在意&#xff0c;后面想了想发现我貌似也一直犯了以下的错误&#xff0c;而错误的原因在于我在新手阶段学习C/C并不是查阅文档扎好脚步学习的&#xff0c;而是被铺天盖地的新手学习基础教程里…

Java“牵手”天猫商品列表数据,关键词搜索天猫商品数据接口,天猫API申请指南

天猫商城是一个网上购物平台&#xff0c;售卖各类商品&#xff0c;包括服装、鞋类、家居用品、美妆产品、电子产品等。要获取天猫商品列表和商品详情页面数据&#xff0c;您可以通过开放平台的接口或者直接访问天猫商城的网页来获取商品详情信息。以下是两种常用方法的介绍&…

Vue2向Vue3过度Vuex核心概念actions

目录 1 核心概念 - actions1.定义actions2.组件中通过dispatch调用 2 辅助函数 -mapActions 1 核心概念 - actions state是存放数据的&#xff0c;mutations是同步更新数据 (便于监测数据的变化, 更新视图等, 方便于调试工具查看变化)&#xff0c; actions则负责进行异步操作 说…

云南森林火灾vr消防模拟安全演练系统训练消防员火灾和事故的适应和应对能力

据统计,每一场破坏性地震发生后,会引发次生的灾害,而火灾是其中之一。导致火灾的原因,推测是地震时使供电线路短路,引燃易燃物,火灾就随即发生。所以,在日常生活中,定期的消防演练还是非常必要的, VR消防&#xff0c;是VR公司深圳华锐视点利用VR虚拟现实技术&#xff0c;将VR和…

Unity项目如何上传Gitee仓库

前言 最近Unity项目比较多&#xff0c;我都是把Unity项目上传到Gitee中去&#xff0c;GitHub的话我用的少&#xff0c;可能我还是更喜欢Gitee吧&#xff0c;毕竟Gitee仓库用起来更加方便&#xff0c;注意Unity项目上传时最佳的方式是把 Asste ProjectSetting 两个文件夹上传上…

CFC编程入门_【10分钟学会】

什么是CFC&#xff1a; 【差不多10分钟全学会】 CFC是图形化编程&#xff0c; 跟单片机的连线一样&#xff0c; 唯一的区别&#xff1a;功能块右侧是【只能输出】引脚。 只有左侧引脚可以输入输出。 有哪些控件&#xff1a; 指针&#xff1a;用于拖动功能块。 控制点&#xf…

<七> objectARX开发:创建自定义实体

1、介绍 在某些情况下,CAD中的实体对象无法满足需求,我们需要针对实际情况来设计并绘制自定义的实体,下面就用一个简单的例子来介绍一下自定义实体绘制。 实体形状:包括实体夹点和文字夹点拖动实现。 2、效果 3、创建自定义实体的步骤 新建一个从AcDbEntity继承的类,如C…

谷歌面试-扔鸡蛋

今天想跟大家分享一个有意思的面试题&#xff0c;这让我再一次感叹思维的奇妙&#xff0c;接下来我们一起看看吧~ 首先来看看题目&#xff1a; 你有2颗鸡蛋&#xff0c;需要以最少的尝试次数来判断在100层的高楼上&#xff0c;哪一层楼是鸡蛋的安全层。 换句话说&#xff0c…

(java) 进程调度

目录 进程 首先我们要了解一下什么是进程&#xff1f; 那如何管理进程&#xff1f; PCB中比较重要的属性 进程调度 为什么要进行进程调度&#xff1f; 状态 优先级 上下文 拓展介绍一下寄存器 记账信息 进程 首先我们要了解一下什么是进程&#xff1f; 简单来说…

mongodb聚合排序的一个巨坑

现象&#xff1a; mongodb cpu动不动要100%&#xff0c;如下图 分析原因&#xff1a; 查看慢日志发现&#xff0c;很多条这样的查询&#xff0c;一直未执行行完成&#xff0c;占用大量的CPU [{$match: {"tags.taskId": "64dae0a9deb52d2f9a1bd71e",grnty: …

全流程R语言Meta分析核心技术应用

Meta分析是针对某一科研问题&#xff0c;根据明确的搜索策略、选择筛选文献标准、采用严格的评价方法&#xff0c;对来源不同的研究成果进行收集、合并及定量统计分析的方法&#xff0c;最早出现于“循证医学”&#xff0c;现已广泛应用于农林生态&#xff0c;资源环境等方面。…

【Qt学习】05:自定义封装界面类

OVERVIEW 自定义封装界面类1.QListWidget2.QTreeWidget3.QTableWidget4.StackedWidget5.Others6.自定义封装界面类-显示效果&#xff08;1&#xff09;添加设计师界面类&#xff08;2&#xff09;在ui中设计自定义界面&#xff08;3&#xff09;在需要使用的界面中添加&#xf…

小区物业业主管理信息系统设计的设计与实现(论文+源码)_kaic

摘 要 随着互联网的发展&#xff0c;网络技术的发展变得极其重要&#xff0c;所以依靠计算机处理业务成为了一种社会普遍的现状。管理方式也自然而然的向着现代化技术方向而改变&#xff0c;所以纯人工管理方式在越来越完善的现代化管理技术的比较之下也就显得过于繁琐&#x…

ReoGrid.NET集成到winfrom

ReoGrid一个支持excel操作的控件,支持集成到任何winfrom项目内。 先看效果图: 如何使用&#xff1a; 使用ReoGrid自带excel模版设计工具先设计一个模版,设计器如下&#xff1a; 具体例子看官方文档 代码示例如下&#xff1a; var sheet reoGridControl1.CurrentWorksheet; …

live555server环境搭建

live555环境搭建详解&#xff08;ubuntu18.04&#xff09; 1.环境依赖 openssl可选安不安 安装&#xff08;选择好版本&#xff09; sudo apt-get update sudo apt-get install openssl sudo apt-get install libssl-dev使用头文件是否可用时编译测试时记得链接&#xff08…