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文件將圖片文件解包

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM