pak文件的打包和解包

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

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

外部文件实现的

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

文件的打包

 1 #include<iostream>
 2 #include<fstream>//观于文件的头函数
 3 using namespace std;
 4 
 5 struct fileInfo
 6 {
 7     int fileSize;//文件大小
 8     int fileOff;//文件在pak中的偏移
 9     int fileNameSize;//文件名的长度
10     char* fileName;//文件名
11 };
12 int main()
13 {
14     fileInfo pic[4] = { { 0, 0, 0, "背景.jpg" }, { 0, 0, 0, "人物.jpg" }, { 0, 0, 0, "箱子.jpg" }, { 0, 0, 0, "目的地.jpg" } };
15     //初始化结构体 给结构体内存放数据
16     int listNum = 4, listSize = 8;
17 
18     fstream resFile[4];//源文件
19     fstream srcFile;//打包之后的文件
20     for (int i = 0; i < 4; i++)
21     {
22         resFile[i].open(pic[i].fileName, ios::in | ios::binary);//打开文件 文本或二进制文件
23         resFile[i].seekg(0, ios::end);//将文件指针移动到文件末尾end
24         pic[i].fileSize = resFile[i].tellg();//得到文件的大小tellg
25         pic[i].fileNameSize = strlen(pic[i].fileName);//求文件名长度
26         listSize += 4 + 4 + 4 + pic[i].fileNameSize;//加上单条索引表的长度
27         // 文件大小4  +文件偏移量4+ 文件名大小4 +文件名长度
28     }
29     for (int i = 0; i < 4; ++i)
30     {
31         if (i == 0)//第一个文件
32         {
33             pic[i].fileOff = listSize;//第一个文件的偏移量就是索引表大小
34         }
35         else
36         {
37             pic[i].fileOff = pic[i - 1].fileOff + pic[i - 1].fileSize;
38             //计算后面的文件偏移量
39         }
40     }
41     srcFile.open("new.pak", ios::out | ios::binary);//准备写入文件
42 
43     srcFile.write((char*)&listSize, sizeof(int));//写入索引表的大小和索引表的个数
44     srcFile.write((char*)&listNum, sizeof(int));
45 
46     for (int i = 0; i < 4; ++i)//写索引表
47     {
48         srcFile.write((char*)&pic[i].fileSize, sizeof(int));
49         srcFile.write((char*)&pic[i].fileOff, sizeof(int));
50         srcFile.write((char*)&pic[i].fileNameSize, sizeof(int));
51         srcFile.write(pic[i].fileName, pic[i].fileNameSize);
52     }
53 
54     for (int i = 0; i < 4; ++i)//写入文件内容
55     {
56         resFile[i].seekg(0, ios::beg);//将文件指针移动到文件开头
57         while (!resFile[i].eof())//写文件
58         {
59             srcFile.put(resFile[i].get());
60         }
61         srcFile.seekp(-1, ios::cur);//删掉一个字节  避免多写入数据
62         resFile[i].close();//写完关闭
63     }
64 
65     srcFile.close();
66 
67 
68     cin.get();
69     return 0;
70 }

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

文件的解包

 1 #include<iostream>
 2 #include<fstream>
 3 using namespace std;
 4 
 5 struct fileInfo
 6 {
 7     int fileSize;//文件大小
 8     int fileOff;//文件在pak中的偏移
 9     int fileNameSize;//文件名的长度
10     char fileName[128];//文件名
11 };
12 
13 
14 int main()
15 {
16     fstream file;
17     file.open("new.pak", ios::in | ios::binary);//读取文件
18     fileInfo pic[4];//写文件的时候大小可能不止四个  
19     int listSize, listNum;// Num是索引表的个数
20 
21     file.read((char*)&listSize, sizeof(int));//读到索引表的大小
22     file.read((char*)&listNum, sizeof(int));
23 
24     //读取每条索引的内容
25     for (int i = 0; i < listNum; ++i)
26     {
27         file.read((char*)&pic[i].fileSize, sizeof(int));
28         file.read((char*)&pic[i].fileOff, sizeof(int));
29         file.read((char*)&pic[i].fileNameSize, sizeof(int));
30         file.read(pic[i].fileName, pic[i].fileNameSize);//需要注意\0
31         pic[i].fileName[pic[i].fileNameSize] = '\0';
32         cout << i << "个文件的内容------------------" << endl;
33         cout << pic[i].fileSize << endl;
34         cout << pic[i].fileOff << endl;
35         cout << pic[i].fileNameSize << endl;
36         cout << pic[i].fileName << endl;
37     }
38     fstream res[4];//大小其实用vector或者new好一点   listNum
39 
40 
41     //前面有文件大小和文件偏移量  如果读取特定的文件 可以直接用索引中的大小和偏移量读取
42     for (int i = 0; i < listNum; ++i)
43     {
44         res[i].open(pic[i].fileName, ios::out | ios::binary);
45         for (int j = 0; j < pic[i].fileSize; ++j)
46         {
47             res[i].put(file.get());
48         }
49         res[i].close();
50     }
51 
52 
53     file.close();//关闭文件
54     cin.get();
55     return 0;
56 }

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

 

posted @ 2019-08-21 13:03  insist钢  阅读(12274)  评论(0编辑  收藏  举报