pak格式的文件 一般游戏有资源 游戏素材会打包放进去

比如游戏语音 游戏多加点语音  多加一些贴图资源

外部文件实现的

素材--->pak文件--->用的时候从文件中取出来

文件的打包

 #include<iostream>
#include<fstream>//观于文件的头函数
using namespace std; struct fileInfo
{
int fileSize;//文件大小
int fileOff;//文件在pak中的偏移
int fileNameSize;//文件名的长度
char* fileName;//文件名
};
int main()
{
fileInfo pic[] = { { , , , "背景.jpg" }, { , , , "人物.jpg" }, { , , , "箱子.jpg" }, { , , , "目的地.jpg" } };
//初始化结构体 给结构体内存放数据
int listNum = , listSize = ; fstream resFile[];//源文件
fstream srcFile;//打包之后的文件
for (int i = ; i < ; i++)
{
resFile[i].open(pic[i].fileName, ios::in | ios::binary);//打开文件 文本或二进制文件
resFile[i].seekg(, ios::end);//将文件指针移动到文件末尾end
pic[i].fileSize = resFile[i].tellg();//得到文件的大小tellg
pic[i].fileNameSize = strlen(pic[i].fileName);//求文件名长度
listSize += + + + pic[i].fileNameSize;//加上单条索引表的长度
// 文件大小4 +文件偏移量4+ 文件名大小4 +文件名长度
}
for (int i = ; i < ; ++i)
{
if (i == )//第一个文件
{
pic[i].fileOff = listSize;//第一个文件的偏移量就是索引表大小
}
else
{
pic[i].fileOff = pic[i - ].fileOff + pic[i - ].fileSize;
//计算后面的文件偏移量
}
}
srcFile.open("new.pak", ios::out | ios::binary);//准备写入文件 srcFile.write((char*)&listSize, sizeof(int));//写入索引表的大小和索引表的个数
srcFile.write((char*)&listNum, sizeof(int)); for (int i = ; i < ; ++i)//写索引表
{
srcFile.write((char*)&pic[i].fileSize, sizeof(int));
srcFile.write((char*)&pic[i].fileOff, sizeof(int));
srcFile.write((char*)&pic[i].fileNameSize, sizeof(int));
srcFile.write(pic[i].fileName, pic[i].fileNameSize);
} for (int i = ; i < ; ++i)//写入文件内容
{
resFile[i].seekg(, ios::beg);//将文件指针移动到文件开头
while (!resFile[i].eof())//写文件
{
srcFile.put(resFile[i].get());
}
srcFile.seekp(-, ios::cur);//删掉一个字节 避免多写入数据
resFile[i].close();//写完关闭
} srcFile.close(); cin.get();
return ;
}

//运行后将文件打包到new.pak中

文件的解包

 #include<iostream>
#include<fstream>
using namespace std; struct fileInfo
{
int fileSize;//文件大小
int fileOff;//文件在pak中的偏移
int fileNameSize;//文件名的长度
char fileName[];//文件名
}; int main()
{
fstream file;
file.open("new.pak", ios::in | ios::binary);//读取文件
fileInfo pic[];//写文件的时候大小可能不止四个
int listSize, listNum;// Num是索引表的个数 file.read((char*)&listSize, sizeof(int));//读到索引表的大小
file.read((char*)&listNum, sizeof(int)); //读取每条索引的内容
for (int i = ; i < listNum; ++i)
{
file.read((char*)&pic[i].fileSize, sizeof(int));
file.read((char*)&pic[i].fileOff, sizeof(int));
file.read((char*)&pic[i].fileNameSize, sizeof(int));
file.read(pic[i].fileName, pic[i].fileNameSize);//需要注意\0
pic[i].fileName[pic[i].fileNameSize] = '\0';
cout << i << "个文件的内容------------------" << endl;
cout << pic[i].fileSize << endl;
cout << pic[i].fileOff << endl;
cout << pic[i].fileNameSize << endl;
cout << pic[i].fileName << endl;
}
fstream res[];//大小其实用vector或者new好一点 listNum //前面有文件大小和文件偏移量 如果读取特定的文件 可以直接用索引中的大小和偏移量读取
for (int i = ; i < listNum; ++i)
{
res[i].open(pic[i].fileName, ios::out | ios::binary);
for (int j = ; j < pic[i].fileSize; ++j)
{
res[i].put(file.get());
}
res[i].close();
} file.close();//关闭文件
cin.get();
return ;
}

//运行exe文件将图片文件解包

pak文件的打包和解包的更多相关文章

  1. [android]system.img文件的打包和解包

    1:system.img的两种格式 system2_0.img: Linux rev 1.0 ext4 filesystem data, UUID=57f8f4bc-abf4-655f-bf67-94 ...

  2. python中*和**的打包和解包

    python中的*和**,能够让函数支持任意数量的参数,它们在函数定义和调用中,有着不同的目的 一. 打包参数 * 的作用:在函数定义中,收集所有的位置参数到一个新的元组,并将这个元组赋值给变量arg ...

  3. unity学习 5.x依赖打包和解包

    unity5已经封装好了接口,所以依赖打包并没有那么神秘和复杂了. 打包: 1.定义好资源的assetBundleName 2.BuildPipeline.BuildAssetBundles,指定资源 ...

  4. xpack文件打包解包代码库

    Github ###概述 xpack是一个文件资源打包工具及类库,可以对多文件进行打包解包. 其使用文件名的hash作为索引,建立hash索引表以加速文件查找. ###特性 支持hashid自动解冲突 ...

  5. Day004_Linux基础_基础命令之tar打包解包

    基础命令之 打包,和解包. tar zcvf 打包的参数  tar zcvf /tmp/etc.tar.gz /etc  将/etc/下的文件压缩成一个压缩包 z  通过gzip工具进行压缩 c 表示 ...

  6. Linux 文件的打包压缩

    压缩和解压 压缩:为了节约磁盘空间. gzip --- .gz bzip2 --- .bz2 xz --- .xz compress --- .z 压缩比例:xz > bzip2 > gz ...

  7. Android将Activity 打 jar包 (解决资源文件不能打包的问题)

    转载地址:http://blog.csdn.net/xiaanming/article/details/9257853 最近有一个需要,我们公司做了一个apk客户端,然后其他的公司可以根据自己的需要来 ...

  8. Android将Activity打成jar包供第三方调用(解决资源文件不能打包的问题)

    转载地址:http://blog.csdn.net/xiaanming/article/details/9257853 最近有一个需要,我们公司做了一个apk客户端,然后其他的公司可以根据自己的需要来 ...

  9. 【转】Android将Activity打成jar包供第三方调用(解决资源文件不能打包的问题)

    Android中引入第三方Jar包的方法(java.lang.NoClassDefFoundError解决办法) 鼠标右键项目,然后属性,然后java buildpath 然后order and ex ...

随机推荐

  1. JAVA通过URL链接获取视频文件信息(无需下载文件)

    最近项目碰到一个大坑:APP上需要在获取视频列表时就获取视频的时长,但早期上传的时候数据库都没有保存这个数据,所以前段时间添加一个时长字段,在上传时手动输入视频时长,但是之前库中有上万条数据没这个信息 ...

  2. 个人用户永久免费,可自动升级版Excel插件,使用VSTO开发,Excel催化剂安装过程详解及安装失败解决方法

    因Excel催化剂用了VSTO的开发技术,并且为了最好的用户体验,用了Clickonce的布署方式(无需人工干预自动更新,让用户使用如浏览器访问网站一般,永远是最新的内容和功能).对安装过程有一定的难 ...

  3. Linux环境Oracle数据库访问出现ORA-01034错误:oracle not available解决

    首先将用户切换为Oracle用户登录,su - oracle; 进入:sqlplus / as sysdba: 问题现象: SQL> select * from dba_users; selec ...

  4. Docker 工作原理及容器化简易指南

    Docker 非常棒! 它使软件开发者无需担心配置和依赖性,在任何地方打包,发送和运行他们的应用程序.而在与 Kubernetes 相结合后,它使应用集群部署和管理变得更方便.这使得 Docker 深 ...

  5. File文件类

    目录 File文件类 File类的构造方法 File类的创建功能 File类的重命名 File类的删除功能 File类的判断功能 File类的获取功能 文件名称过滤器 File文件类 File:文件和 ...

  6. VS Code 安装 LeetCode 插件

    练习算法绕不开的一个网站就是力扣,很多小伙伴为了拿到大厂 offer,刷题都刷到吐了. 然而如果直接在 LeetCode 上写代码,那是很痛苦的一件事,那就相当于用 txt 写代码一样,没有 IDE ...

  7. AbstractList

    概述 此类提供 List 接口的骨干实现,以最大限度地减少实现“随机访问”数据存储(如数组)支持的该接口所需的工作.对于连续的访问数据(如链表),应优先使用 AbstractSequentialLis ...

  8. 【iOS】UILabel 常用属性设置

    UILabel 的一些常用属性,示例代码如下: // 字体大小 label.font = [UIFont systemFontOfSize:14.0]; label.font = [UIFont fo ...

  9. RGB颜色 三者都是0为黑色而255是白色 解释

    问题: RGB颜色 都是0为黑色而255是白色 与日常生活的黑色白色差距怎么那么大,(与物理学中的黑色吸收光是否相悖)而且为什么要这样定义呢? 链接:https://www.zhihu.com/que ...

  10. VSTO之PowerPoint(PPT)插件开发常用API汇总

    VSTO简介 VSTO(Visual Studio Tools for Office )是VBA的替代,使得开发Office应用程序更加简单,并且用VSTO来开发office应用程序可以使用Visua ...