我花了無數個小時搜索有關這樣的話題的信息。我正在用C++編寫自己的自定義遊戲引擎,以便使用SDL。我正在嘗試創建一個自定義二進制文件來管理我的遊戲資源。到目前爲止,我還沒有能夠讓媒體在存儲我放置在文件中的每個「類型」對象時發揮出色。所以我放棄了使用矢量的想法並進入了數組。我在下面的例子中都使用了矢量或數組。所以,首先我爲這個文件創建一個頭文件。下面是結構:C++自定義二進制資源文件
struct Header
{
const char* name; // Name of Header file
float version; // Resource version number
int numberOfObjects;
int headerSize; // The size of the header
};
然後創建所述報頭之後,我有另一結構,其限定一個目的是如何存儲在存儲器中。那就是:
struct ObjectData{
int id;
int size;
const char* name;
// std::vector<char> data; // Does not work very well
// unsigned char* data; // Also did not
// Also does not work, because I do not know the size yet until I have the data.
// char data[]
};
這種結構的主要問題是,載體不玩好,無符號的字符指針不停地給我的問題,和char數據的數組(十六進制存儲)是行不通的,因爲我的編譯器不喜歡變量數組。
最終的結構是我的資源文件結構。
struct ResourceFile
{
Header header;
int objectCount;
// Again, vectors giving me issues because of how they are constructed internally
// std::vector<ObjectData> objectList;
// Below does not work because, again, no variable data types;
// ObjectData objects[header.numberOfObjects]
};
我的目標是能夠寫出一個單一的結構到二進制文件。像這樣:
Header header;
header.name = "Resources.bin";
header.version = 1.0f;
header.headerSize = sizeof(header);
//vector<char> Object1 = ByteReader::LoadFile("D:\\TEST_FOLDER\\test.obj");
//vector<char> Object2 = ByteReader::LoadFile("D:\\TEST_FOLDER\\test.obj");
ObjectData cube;
cube.id = 0;
cube.name = "Evil Cubie";
cube.data = ByteReader::LoadFile("D:\\TEST_FOLDER\\test.obj");
cube.size = sizeof(cube.id) + sizeof(cube.name) + cube.data.size();
ofstream resourceFile("D:\\TEST_FOLDER\\Resources.bin", ios::out|ios::app|ios::binary);
resourceFile << header.name << header.version << header.headerSize;;
resourceFile << cube.id << cube.name << cube.size;
for each (char ch in cube.data)
{
resourceFile << ch;
}
resourceFile.close();
/*
ObjectData cube2;
cube.id = 1;
cube.name = "Ugle Cubie";
for each (char ch in Object1)
{
cube.object.push_back(ch);
}
*/
//resourceFile.data.push_back(cube);
//resourceFile.data.push_back(cube2);
//resourceFile.header.numberOfObjects = resourceFile.data.size();
//FILE* dat = fopen(filename, "wb");
//fwrite(&resourceFile, sizeof(resourceFile), 1, dat); // <-- write to resource file
//fclose(dat);
正如您在上面注意到的,我嘗試了兩種不同的方式。我嘗試的第一種方法是使用很好的舊fwrite。第二種方法甚至沒有用二進制編寫它,即使我通過由ofstream接受的標誌告訴計算機這樣做。
我的目標是讓代碼像這樣流利工作:
ResourceFile resourceFile;
resourceFile.header.name = "Resources.bin";
resourceFile.header.version = 1;
resrouceFile.header.numberOfObjects = 2;
resourceFile.header.headerSize = sizeof(resourceFile.header);
ObjectData cube;
ObjectData cube2;
resourceFile.data.push_back(cube);
resourceFile.data.push_back(cube2);
resourceFile.header.numberOfObjects = resourceFile.data.size();
FILE* dat = fopen(filename, "wb");
fwrite(&resourceFile, sizeof(resourceFile), 1, dat); // <-- write to resource file
fclose(dat);
仍然沒有雪茄。任何人都有任何指針(沒有雙關語意思)或資源管理器的適當例子?
這是一個適當的觀察我的朋友!我沒有收到任何錯誤。有什麼建議麼? – Ryan