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[]データを構造体データに変換するにはどうすればよいですか?