我已經用C#中的BinaryWriter寫了幾個int,char []和數據文件。用BinaryReader將文件讀回(在C#中),我可以完美地重新創建文件的所有部分。在C++中是否有BinaryReader讀取從C#中的BinaryWriter寫入的數據?
但是,試圖用C++讀取它們會產生一些可怕的結果。我正在使用fstream嘗試讀取數據,並且數據沒有正確讀取。在C++中,我用ios::in|ios::binary|ios::ate
設置了fstream,並使用seekg來定位我的位置。然後我讀取下四個字節,它們被寫爲整數「16」(並正確讀入C#)。這讀取1244780在C + +(不是內存地址,我檢查)。爲什麼會這樣?在C++中是否有與BinaryReader相當的功能?我注意到它在msdn上提到,但這是Visual C++和intellisense甚至不像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」來,我收到完全相同的值。
你能告訴我們一段代碼(或整個代碼)和一個二進制文件的例子嗎? – coelhudo
我已經發布了一些代碼。不知道我可以在哪裏上傳二進制文件。 – Chris
你閱讀你的C#閱讀器中的chris.dat和你的C++閱讀器中的datafile.dat ... – Pondidum