我花了无数个小时搜索有关此类主题的信息。我正在编写自己的自定义游戏引擎,以便在 C++ 中使用 SDL。我正在尝试创建一个自定义二进制文件来管理我的游戏资源。到目前为止,在存储我放置在文件中的每种“类型”对象时,我还不能让向量发挥得很好。所以我放弃了使用向量的想法,转而使用数组。我在下面有两个示例,其中我同时使用了向量或数组。所以,首先我为文件创建一个标题。这是结构:
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[]
};
这个结构的主要问题是向量不能很好地发挥作用,一个无符号字符指针一直给我带来问题,并且一个字符数据数组(用于十六进制存储)不起作用,因为我的编译器不喜欢变量数组。
最后一个结构是我的资源文件结构。
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);
还是没有雪茄。任何人都有任何指针(没有双关语)或资源管理器的适当示例?