C# の BinaryWriter を使用して、いくつかの int、char[] などをデータ ファイルに書き込みました。BinaryReader を使用して (C# で) ファイルを読み込むと、ファイルのすべての部分を完全に再作成できます。
ただし、C++ で読み戻そうとすると、恐ろしい結果が生じます。fstream を使用してデータを読み戻そうとしましたが、データが正しく読み込まれませんでした。C++ で fstream を設定し、ios::in|ios::binary|ios::ate
seekg を使用して自分の場所をターゲットにしました。次に、整数 "16" として書き込まれた次の 4 バイトを読み取ります (C# に正しく読み取ります)。これは、C++ では 1244780 と表示されます (メモリ アドレスではありません。確認しました)。これはなぜでしょうか?C++ の BinaryReader に相当するものはありますか? msdn で言及されていることに気付きましたが、それは Visual C++ であり、インテリセンスは私には c++ のようにも見えません。
ファイルを書き込むためのコード例 (C#):
public static void OpenFile(string filename)
{
fs = new FileStream(filename, FileMode.Create);
w = new BinaryWriter(fs);
}
public static void WriteHeader()
{
w.Write('A');
w.Write('B');
}
public static byte[] RawSerialize(object structure)
{
Int32 size = Marshal.SizeOf(structure);
IntPtr buffer = Marshal.AllocHGlobal(size);
Marshal.StructureToPtr(structure, buffer, true);
byte[] data = new byte[size];
Marshal.Copy(buffer, data, 0, size);
Marshal.FreeHGlobal(buffer);
return data;
}
public static void WriteToFile(Structures.SomeData data)
{
byte[] buffer = Serializer.RawSerialize(data);
w.Write(buffer);
}
データ ファイルを表示する方法がわかりません。
データを読み戻す例 (C#):
BinaryReader reader = new BinaryReader(new FileStream("C://chris.dat", FileMode.Open));
char[] a = new char[2];
a = reader.ReadChars(2);
Int32 numberoffiles;
numberoffiles = reader.ReadInt32();
Console.Write("Reading: ");
Console.WriteLine(a);
Console.Write("NumberOfFiles: ");
Console.WriteLine(numberoffiles);
これはC++で実行したいです。最初の試行 (最初の整数で失敗):
fstream fin("C://datafile.dat", ios::in|ios::binary|ios::ate);
char *memblock = 0;
int size;
size = 0;
if (fin.is_open())
{
size = static_cast<int>(fin.tellg());
memblock = new char[static_cast<int>(size+1)];
memset(memblock, 0, static_cast<int>(size + 1));
fin.seekg(0, ios::beg);
fin.read(memblock, size);
fin.close();
if(!strncmp("AB", memblock, 2)){
printf("test. This works.");
}
fin.seekg(2); //read the stream starting from after the second byte.
int i;
fin >> i;
編集:「seekg」を使用する場所に関係なく、まったく同じ値を受け取るようです。