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文件将图片文件解包
原文地址:https://www.cnblogs.com/liugangjiayou/p/11388142.html
时间: 2024-11-09 10:29:44