Comment pourrait-on s'y prendre? Aussi, y a-t-il un moyen facile de le faire? En utilisant un lib comme Boost ou quelque chose?lire un int à partir d'un fichier écrit par la méthode writeInt de Java en C++?
Répondre
Le DataOutputStream qui écrit l'int écrit un entier de 4 octets, avec les octets hauts en premier. Lit dans char *, réinterprète et si vous avez besoin de convertir l'ordre des octets, utilisez ntohl.
ifstream is;
is.open ("test.txt", ios::binary);
char* pBuffer = new char[4];
is.read (pBuffer, 4);
is.close();
int* pInt = reinterpret_cast<int*>(pBuffer);
int myInt = ntohl(*pInt); // This is only required if you are on a little endian box
delete [] pBuffer;
Tout va bien jusqu'à ce que vous atteigniez une plate-forme où 'sizeof (int)! = 4'. Ou un où les entiers sont ceux de complément ou de signe-un, et non le complément de deux (tous permis par ISO C99). –
... ainsi que ISO C++ –
Sur quelle plate-forme les entiers sont-ils complémentaires ou sign-bit? J'aimerais savoir. – anio
Idées:
- lu en binaire droite, puis convertir/octets si nécessaire interprètent. Donc, si Java a écrit 4 octets pour l'int, alors vous lisez dans 4 octets. S'il y a une quelconque chose à changer, alors faites-le, puis copiez (ou copiez) le tableau d'octets vers un C++ int
- Si vous pouvez changer le code Java, vous pouvez l'écrire comme quelque chose de commun que C++ peut lire comme Texte UTF-8 ou ascii, ou format de protocole Google Tampons ou autre chose.
La seule façon multi-plateforme pour le faire est de le lire octet par octet (qui est, par char
char
), et de construire un nombre entier d'entre eux. Vous voudriez utiliser long
, car int
n'est pas garanti assez large pour contenir une valeur de 32 bits. Je suppose que vous avez lu les octets dans un tableau char[4]
ici (autres réponses ont déjà démontré comment le faire):
char bytes[4];
...
long n = (long(bytes[0]) << 24) | (long(bytes[1]) << 16) |
(long(bytes[2]) << 8) | long(bytes[3])
double possible: http://stackoverflow.com/questions/1154991/load- binary-file-using-fstream –