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. 通过sparkstreaming分析url的数据

    spark version 1.6.2 scala verson 2.10.6 此代码参考官方例子---- 自定义接收器 import java.io.BufferedReader import or ...

  2. 创建RDD

    RDD创建 在Spark中创建RDD的创建方式大概可以分为三种:从集合中创建RDD:从外部存储创建RDD:从其他RDD创建. 由一个已经存在的Scala集合创建,集合并行化,而从集合中创建RDD,Sp ...

  3. [leetcode] 263. Ugly Number (easy)

    只要存在一种因数分解后,其因子是2,3,5中的一种或多种,就算是ugly数字. 思路: 以2/3/5作为除数除后,最后结果等于1的就是ugly数字 Runtime: 4 ms, faster than ...

  4. 【SVN】SVN使用教程总结

    SVN使用教程总结 SVN简介: 为什么要使用SVN? 程序员在编写程序的过程中,每个程序员都会生成很多不同的版本,这就需要程序员有效的管理代码,在需要的时候可以迅速,准确取出相应的版本. Subve ...

  5. CentOS 下配置JDK

    从官网上下载jdk到系统中,并解压好 tar –axvf jdk.tr.gz 1. PATH环境变量.作用是指定命令搜索路径,在shell下面执行命令时,它会到PATH变量所指定的路径中查找看是否能找 ...

  6. <<Modern CMake>> 翻译 2.2 CMake 编程

    <<Modern CMake>> 翻译 2.2 CMake 编程 流程控制 CMake有一个 if 语句, 经年累月之后,现在它已经相当复杂. 您可以在 if 语句中使用全大写 ...

  7. iis8 php-cgi.exe - FastCGI 进程意外退出 500错误解决办法

    今天iis服务环境下的网站突然显示200错误php-cgi.exe - FastCGI 进程意外退出,昨天还好好的网站正常,这个问题一直偶尔出现几次,不是很频繁,但是偶尔会出现: 这是由于某些加载库加 ...

  8. Linux系统管理----磁盘管理与文件系统

    1.为主机新增两块30GB的SCSI硬盘 找到要添加的虚拟机,单击鼠标右键,点击设置 点击添加 选择硬件类型,然后点击下一步 选择要创建的磁盘类型,然后点击下一步 指定要创建磁盘的容量,然后点击下一步 ...

  9. 【iOS】Xcode 插件安装后无效

    今天把 Xcode 升级到 7.3.1,发现插件安装后无效…… 原因:苹果要求加入UUID证书从而保证插件的稳定性. 解决方法: 1. 查看Xcode的UUID 在终端输入以下命令: defaults ...

  10. 腾讯位置服务API快速入门

    前言 之前项目有个需求,在网页上显示微信发送过来的位置信息,该开始想用百度地图,后来发现腾讯地图相对简单一点 快速入门 申请Key https://lbs.qq.com/guides/startup. ...