功能设计:设计一种自定义三维格式,可以接受常见的三维模型数据,主要包括几何数据、属性数据及纹理材质数据。其中几何数据以.dat后缀的二进制数据来进行存储;属性数据以.csv的表格形式来存储;纹理材质图片保存到文件夹内;

CFileManager.h

#pragma once#include "ModelData.h"
class CFileManager
{public:CFileManager();~CFileManager();void Save(PCTSTR szPath) const;bool Load(PCTSTR szPath);const char* GetFileMagic() const;UINT GetVersion() const;// 当Load()返回false后,获取错误信息CString GetErrorStr() const;CModelDataArray m_aryModelData; // 模型数据private:// 文件头static const char s_fileMagic[4];// 版本号const unsigned int m_version;CString m_strError;
};

CFileManager.cpp

#include "StdAfx.h"
#include "FileManager.h"const char CFileManager::s_fileMagic[4] = { 'A','B','C','D' };CFileManager::CFileManager(): m_version(100) // 大版本升级加100,小版本升级加1
{}CFileManager::~CFileManager()
{}const char* CFileManager::GetFileMagic() const
{return s_fileMagic;
}UINT CFileManager::GetVersion() const
{return m_version;
}CString CFileManager::GetErrorStr() const
{return m_strError;
}void CFileManager::Save(PCTSTR szPath) const
{// 写入二进制数据CString strFileName = (CString)szPath + _T("\\model.dat");std::ofstream wFile(strFileName, std::ios::binary);if (wFile.is_open() == false){return;}wFile.write(s_fileMagic, 4);wFile.write(reinterpret_cast<const char*>(&m_version), sizeof(UINT));std::streampos fileSizePos = wFile.tellp();UINT64 uTotalLen = 0;wFile.write(reinterpret_cast<char*>(&uTotalLen), sizeof(UINT64)); // 模型数据长度,占位int nHeaderSize = 4 + sizeof(UINT) + sizeof(UINT64);// 保存模型的个数UINT nModelCount = (UINT)m_aryModelData.size();wFile.write(reinterpret_cast<char*>(&nModelCount), sizeof(UINT));if (nModelCount > 0){for (UINT i = 0; i < nModelCount; i++){m_aryModelData[i].Save(wFile);}}wFile.flush();std::streampos total = wFile.tellp();wFile.seekp(fileSizePos);uTotalLen = static_cast<UINT64>(total - (std::streampos)nHeaderSize);wFile.write(reinterpret_cast<char*>(&uTotalLen), sizeof(UINT64));
}bool CFileManager::Load(PCTSTR szPath)
{// 读取二进制数据CString strFileName = (CString)szPath + _T("\\model.dat");m_strError.Empty();std::ifstream iFile(strFileName, std::ios::binary);if (iFile.is_open() == false){m_strError.Format(_T("加载文件%s失败!"), szPath);return false;}char cHeadpart[4] = { 0 };iFile.read(cHeadpart, 4);for (int i = 0; i < 4; i++){if (cHeadpart[i] != s_fileMagic[i]){m_strError.Format(_T("%s的文件头错误!"), szPath);return false;}}UINT thatVer = 0;iFile.read(reinterpret_cast<char*>(&thatVer), sizeof(UINT));if (thatVer == 0 || thatVer > m_version){m_strError.Format(_T("文件%s的版本号错误!读取的版本号为%u,当前版本号为%u"), szPath, thatVer, m_version);return false;}UINT64 uTotalLen = 0;iFile.read(reinterpret_cast<char*>(&uTotalLen), sizeof(UINT64)); // 模型数据长度int nHeaderSize = 4 + sizeof(UINT) + sizeof(UINT64);UINT nModelCount = 0;iFile.read(reinterpret_cast<char*>(&nModelCount), sizeof(UINT));if (nModelCount > 0){m_aryModelData.clear();m_aryModelData.reserve(nModelCount);for (UINT i = 0; i < nModelCount; i++){CModelData model;model.Load(iFile);m_aryModelData.push_back(model);}}UINT64 uRealen = (UINT64)iFile.tellg() - (UINT64)nHeaderSize;if (uRealen != uTotalLen){m_strError.Format(_T("记录的数据长度%I64u与实际值%I64u不匹配!"), uTotalLen, uRealen);return false;}return true;
}

<一> 从头设计一个三维模型存储格式.dat3d——文件保存类设计相关推荐

  1. VC中海量文件读写类设计与应用(转)

    VC中海量文件读写类设计与应用   沈瑞冰 摘要 本文阐述了海量文件读写的一般方法,并分析了该方法中存在的内存耗尽问题和解决办法,并就此设计了一个海量文件读写类,封装了海量文件读写操作,最后给出了一个 ...

  2. VC中海量文件读写类设计与应用

    VC中海量文件读写类设计与应用 文件操作是应用程序最为基本的功能之一,Win32 API和MFC均提供有支持文件处理的函数和类,常用的有Win32 API的CreateFile().WriteFile ...

  3. 用Java写PTA 7-11 设计一个能处理异常的Loan类

    用Java写PTA 7-11 设计一个能处理异常的Loan类 定义一个贷款类Loan,其中有属性: annualInterestRate:double,表示贷款的年利率(默认值:2.5) number ...

  4. Python面向对象基础练习——设计一个名为 MyRectangle 的矩形类来表示矩形

    # 设计一个名为 MyRectangle 的矩形类来表示矩形.这个类包含 # (1) 左上角顶点的坐标:x,y # (2) 宽度和高度:width.height # (3) 构造方法:传入 x,y,w ...

  5. 设计一个名为 MyRectangle 的矩形类来表示矩形

    设计一个名为 MyRectangle 的矩形类来表示矩形.这个类包含 (1) 左上角顶点的坐标:x,y (2) 宽度和高度:width.height (3) 构造方法:传入 x,y,width,hei ...

  6. 设计一个名为Rectangle的矩形类,这个类包括:两个名为width和height的double数据域。

    设计一个名为Rectangle的矩形类,这个类包括:两个名为width和height的double数据域,它们分别表示矩形的宽和高.width和height的默认值都为1.该类包括矩形类的无参构造函数 ...

  7. Python基础学习笔记——设计一个名为MyRectangle的矩形类来表示矩形

    学习目标: '设计一个名为MyRectangle的矩形类来表示矩形,这个类包含: (1)左上角坐标:x,y (2)宽度和高度 (3)构造方法:传入x,y,width,height.如果(x,y)不传默 ...

  8. linux 设计一个程序,要求打开文件 pass 所有者,第二章 Linux 文件操作

    文档均来自网络,如有侵权请联系我删除文档 第二章 Linux 文件操作(4学时) 实验一文件属性和无缓冲I/O 实验目的 1.熟悉Linux文件系统属性控制 2.掌握不带缓存的文件I/O程序设计方法 ...

  9. 如何设计一个好的仪表盘:Dundas Dashboard设计思路

    Dashboard的概念已经存在了很多年了,但这个概念的内涵在这些年发生了很大的变化.从最早的厂家追求靓丽仪表盘的玩具式界面,到今年以研究领域提倡的清楚务实的观点逐占上风,Dashboard已经进入主 ...

最新文章

  1. [转]MySQL innoDB数据插入性能优化
  2. java游戏最终boss烛龙_游戏中劝退玩家的变态小怪!神装扛不住它一击,难度秒杀最终BOSS?...
  3. 20220207-CTF-MISC-第11题--- base64隐写--附带脚本
  4. 带有Spring Boot 2支持的Apache Camel 2.22发布
  5. linux make命令实现,Linux make命令主要参数详解
  6. 再见!阿里云首席科学家闵万里离职:创办风投基金
  7. 多线程 并发编程(一)
  8. dbhelp mysql c_C++写的一个MYSQL控制台(3)
  9. 可能存在无限递归_无限分类递归+排序解剖
  10. 分析数十年的ICS利用,确定漏洞修复优先级
  11. 苹果修复被 XCSSET 恶意软件滥用的3个 0day
  12. HP服务器集成 iLO 端口的配置
  13. RK3399封装(CPU+GPU)Mali-T860 Codec架构(十六)
  14. 当前不会命中断点 还没有为该文档加载任何符号
  15. python notebook_Python Notebook (Jupyter Notebook) 介绍
  16. 发现了《ACE程序员教程》中一个例程的问题
  17. COM组件和一般DLL 的区别
  18. 计算机的com端口万能驱动,USB转串口万能驱动
  19. 程序员那些必须掌握的排序算法(上)
  20. linux6 下dns配置,RHEL6中DNS配置

热门文章

  1. Ubuntu 20.04安装Unreal 4.24
  2. 小甲鱼零基础入门python教程视频_绝对干货!小甲鱼零基础入门Python视频教程全套96集,值得学习...
  3. Linux C语言中的read write lseek的使用
  4. 大三来临!感触良多!
  5. 儿童语言发育迟缓分类中C群d是指,(S—S法)语言发育迟缓检查(CRRC版)
  6. 秒杀系统设计(分布式微服务)
  7. 【转帖】DTF的C代码分析
  8. 【非广告】这是一份专为程序员编写的英语学习指南
  9. 如何使用“时间机器”备份Mac电脑
  10. mysql语句生成在线_在线数据库表(sql语句)生成java实体类工具