游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4477|回复: 17

关于游戏中的记录存储到二进制文件中的问题

[复制链接]

16

主题

68

帖子

72

积分

注册会员

Rank: 2

积分
72
发表于 2010-5-25 12:55:00 | 显示全部楼层 |阅读模式
如题,我用vector存放了一个用户存储游戏中信息的类,如:
class CEditMesh
{
  坐标;
  人物朝向;
  人物信息等;
};
vector<CEditMesh*> g_v_pEditMeshs;

那么我如何把文件记录到二进制文件中?

size_t stSize = g_v_pEditMeshs.size();
fwrite(&stSize, sizeof(stSize), 1, pFile);
fwrite(&g_v_pEditMeshs[0], sizeof(CEditMesh), g_v_pEditMeshs.size(), pFile);
=========================================
size_t stSize;
fread(&stSize, sizeof(stSize), 1, pFile);
g_v_pEditMeshs.resize(stSize);
fread(&g_v_pEditMeshs[0], sizeof(CEditMesh), stSize, pFile);
这样却出现如下图的问题:

0

主题

398

帖子

577

积分

高级会员

Rank: 4

积分
577
发表于 2010-5-25 14:56:00 | 显示全部楼层

Re:关于游戏中的记录存储到二进制文件中的问题

虽然C++中的Class和Struct基本相同了,但是习惯上最好class不要直接访问成员变量,尤其不要使用这种直接的内存写入和读取,因为class和struct使用virtual声明方法时类/结构空间的第一个DWORD是只读的函数表指针.
建议你为CEditMesh增加save和load接口,然后循环vector依次调用来实现储存/读取.

4

主题

46

帖子

46

积分

注册会员

Rank: 2

积分
46
发表于 2010-5-25 15:32:00 | 显示全部楼层

Re:关于游戏中的记录存储到二进制文件中的问题

size_t stSize = g_v_pEditMeshs.size();
fwrite(&stSize, sizeof(size_t), 1, pFile);
fwrite(&g_v_pEditMeshs[0], sizeof(CEditMesh), 1, pFile);
=========================================
size_t stSize;
fread(&stSize, sizeof(size_t), 1, pFile);
g_v_pEditMeshs.resize(stSize);
fread(&g_v_pEditMeshs[0], sizeof(CEditMesh), 1, pFile);

这样似乎能弄1个了,其他的自己弄吧

16

主题

68

帖子

72

积分

注册会员

Rank: 2

积分
72
 楼主| 发表于 2010-5-25 16:03:00 | 显示全部楼层

Re: Re:关于游戏中的记录存储到二进制文件中的问题

helium: Re:关于游戏中的记录存储到二进制文件中的问题

size_t stSize = g_v_pEditMeshs.size();
fwrite(&stSize, sizeof(size_t), 1, pFile);
fwrite(&...

奇怪,还是出现上图那个警告。
这个会不会和我在此操作之前又用来记录读取其它信息的问题呢?例如:
fread(&g_wszSceneMesh, 1, sizeof(g_wszSceneMesh), pFile);
fread(&g_wszSceneMeshOther, 1, sizeof(g_wszSceneMeshOther), pFile);

fread(&g_v_pEditMeshs, 1, sizeof(g_v_pEditMeshs), pFile);
// 重新创建对象
if (g_wszSceneMesh != NULL)
    LoadFloorMesh(g_wszSceneMesh, TRUE);
if (g_wszSceneMeshOther != NULL)
    LoadFloorOtherMesh(g_wszSceneMeshOther, TRUE);
// 重新创建g_v_pEditMeshs里面的对象
if (g_v_pEditMeshs.size() != 0)
{
    MessageBox(DXUTGetHWND(), L"!= null", L"", 0);
    size_t stSize;
    fread(&stSize, sizeof(size_t), 1, pFile);
    g_v_pEditMeshs.resize(stSize);
    fread(&g_v_pEditMeshs[0], sizeof(CEditMesh), 1, pFile);
}

16

主题

68

帖子

72

积分

注册会员

Rank: 2

积分
72
 楼主| 发表于 2010-5-25 16:05:00 | 显示全部楼层

Re: Re:关于游戏中的记录存储到二进制文件中的问题

artint: Re:关于游戏中的记录存储到二进制文件中的问题

虽然C++中的Class和Struct基本相同了,但是习惯上最好class不要直接访问成员变量,尤其不要使用这种直接的内存...

为vector增加save和load函数,然后将vector里面的每个数据都读取这样会不会很麻烦呢?

0

主题

398

帖子

577

积分

高级会员

Rank: 4

积分
577
发表于 2010-5-25 17:13:00 | 显示全部楼层

Re:关于游戏中的记录存储到二进制文件中的问题

想写游戏还怕麻烦?...
举个简单的例子你这个代码就不适用了,
class CEditMesh{
  ...
  D3DXVECTOR3* pVertices;
  ...
};

0

主题

398

帖子

577

积分

高级会员

Rank: 4

积分
577
发表于 2010-5-25 17:17:00 | 显示全部楼层

Re:关于游戏中的记录存储到二进制文件中的问题

才看清楚你代码的错误原因,如果你想使用fread和fwrite,至少应该声明为
vector<CEditMesh> g_v_pEditMeshs;

你代码的写法只是把各个对象的指针写到文件里了....而且比较标准的写法应该是g_v_pEditMeshs.front()....

16

主题

68

帖子

72

积分

注册会员

Rank: 2

积分
72
 楼主| 发表于 2010-5-25 17:25:00 | 显示全部楼层

Re: Re:关于游戏中的记录存储到二进制文件中的问题

artint: Re:关于游戏中的记录存储到二进制文件中的问题

想写游戏还怕麻烦?...
举个简单的例子你这个代码就不适用了,
class CEditMesh{
  ...
  D3DXVECTOR3* pVertices;
  ...
};

受教了,那么按照你给我添加的,如果需要将现有记录写入到文件中,那么应该如何做呢?

0

主题

398

帖子

577

积分

高级会员

Rank: 4

积分
577
发表于 2010-5-25 18:30:00 | 显示全部楼层

Re:关于游戏中的记录存储到二进制文件中的问题

bool CEditMesh::Save(FILE*fp)
{
// TODO: 保存一个 CEditMesh 的特征值,用于校验
fwrite(位置,1,sizeof(位置),fp);
fwrite(人物朝向,1,sizeof(人物朝向),fp);
fwrite(pVertices的长度变量,1,sizeof(pVertices的长度变量), fp);
fwrite(pVertices, 1, 长度, fp);
// Save 其他的成员
return true;
}

16

主题

68

帖子

72

积分

注册会员

Rank: 2

积分
72
 楼主| 发表于 2010-5-25 21:33:00 | 显示全部楼层

Re:关于游戏中的记录存储到二进制文件中的问题

// TODO: 保存一个 CEditMesh 的特征值,用于校验
这个是什么意思?
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-6-9 14:37

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表