我正在使用 BinaryWriter 类在 C# 中编写二进制文件
using (var b = new System.IO.BinaryWriter(System.IO.File.Open("C:\\TextureAtlas0.txa",
System.IO.FileMode.Create)))
{
int count;
// Write the number of source rectangle entries
count = textureAtlas.Rectangles.Count;
b.Write(count);
for (int i = 0; i < count; ++i)
{
b.Write(textureAtlas.SpriteNames[i]);
b.Write(textureAtlas.Rectangles[i].X);
b.Write(textureAtlas.Rectangles[i].Y);
b.Write(textureAtlas.Rectangles[i].Width);
b.Write(textureAtlas.Rectangles[i].Height);
}
}
然后我尝试使用以下步骤将相同的文件读入 C++。
我有一个结构,它以与写入相同的顺序保存数据。
struct TextureAtlasEntry
{
std::string name;
int x;
int y;
int width;
int height;
};
首先读取计数
int count;
fread(&count, sizeof(int), 1, LoadFile);
然后我尝试使用计数值来确定将保存数据的列表大小。我似乎无法使用数组,因为 count 的值会因读取的文件而异。
std::list<TextureAtlasEntry> entries;
fread(&entries, sizeof(TextureAtlasEntry), count, LoadFile);
fclose(LoadFile);
上面的代码不起作用。我可以正确读取计数,但 memcpy 命令会导致 fread 和条目列表的访问冲突。
如何正确读取数据,是否应该将 fread 与 C++ 等价物交换?
编辑:
我现在可以使用以下代码将整个二进制文件读入内存
ifstream::pos_type size;
char *memblock;
ifstream file ("TextureAtlas0.txa", ios::in|ios::binary|ios::ate);
if (file.is_open())
{
size = file.tellg();
memblock = new char[size];
file.seekg (0, ios::beg);
file.read (memblock, size);
file.close();
printf("File content is in memory");
delete[] memblock;
}
else
{
printf("Unable to open file");
}
现在文件在内存中,如何将 char[] 数据转换为 struct 数据?