J'ai écrit plusieurs ints, char [] s et tel dans un fichier de données avec BinaryWriter en C#. En lisant le fichier dans (en C#) avec BinaryReader, je peux recréer parfaitement toutes les parties du fichier. Cependant, tenter de les relire en C++ donne des résultats effrayants. J'utilisais fstream pour essayer de relire les données et les données ne lisent pas correctement. En C++, j'ai mis en place un fstream avec ios::in|ios::binary|ios::ate
et utilisé seekg pour cibler ma position. J'ai alors lu les quatre octets suivants, qui ont été écrits comme l'entier "16" (et lit correctement dans C#). Cela se lit comme 1244780 en C++ (pas l'adresse de la mémoire, j'ai vérifié). Pourquoi cela serait-il? Y a-t-il un équivalent de BinaryReader en C++? Je l'ai remarqué mentionné sur msdn, mais c'est Visual C++ et IntelliSense ne ressemble même pas à C++, pour moi.Y at-il un BinaryReader en C++ pour lire les données écrites à partir d'un BinaryWriter en C#?
Exemple de code pour l'écriture du fichier (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);
}
Je ne sais pas comment je pourrais vous montrer le fichier de données.
Exemple de lecture des données en arrière (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);
Ce que je veux jouer dans C++. Première tentative (échoue au premier entier):
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;
Edit: Il semble que peu importe quel endroit je l'utilise « seekg », je reçois la même valeur exacte.
Pouvez-vous nous montrer un fragment de code (ou code entier) et un exemple de fichier binaire? – coelhudo
J'ai posté du code. Je ne sais pas où je pourrais télécharger le fichier binaire. – Chris
vous lire chris.dat dans votre lecteur C# et datafile.dat dans votre lecteur C++ ... – Pondidum