J'ai du code qui manipule des fichiers binaires en utilisant fstream avec le drapeau binaire activé et en utilisant les fonctions d'E/S non formatées read et write. Cela fonctionne correctement sur tous les systèmes que j'ai utilisés (les bits dans le fichier sont exactement comme prévu), mais ce sont essentiellement des systèmes anglo-saxons. Je me suis interrogé sur la possibilité que ces octets soient modifiés par un codecvt sur un autre système.
Il semble que la norme indique que l'utilisation d'E/S non formatées se comporte de la même manière que l'introduction de caractères dans le streambuf à l'aide de sputc/sgetc. Cela conduira à l'appel des fonctions overflow ou underflow dans le streambuf, et il semble que celles-ci conduisent à ce que les choses passent par un codecvt (par exemple, voir 27.8.1.4.3 dans la norme c++). Pour basic_filebuf, la création de ce codecvt est spécifiée en 27.8.1.1.5. Cela donne l'impression que les résultats dépendront de ce que basic_filebuf.getloc() renvoie.
Ma question est donc la suivante : puis-je supposer qu'un tableau de caractères écrit avec ofstream.write sur un système peut être récupéré mot pour mot avec ifstream.read sur un autre système, quelle que soit la configuration locale utilisée par l'un ou l'autre ? Je ferais les hypothèses suivantes :
- Le programme utilise la locale par défaut par défaut (c'est-à-dire que le programme ne modifie pas lui-même les paramètres régionaux du tout).
- Les deux systèmes ont CHAR_BIT 8, ont le même ordre de bits dans chaque octet, stockent les fichiers sous forme d'octets, etc.
- Les objets stream ont l'indicateur binaire activé.
- Nous n'avons pas besoin de nous soucier des différences d'endianess à ce stade. Si l'un des octets du tableau doit être interprété comme une valeur multi-octets, les conversions d'endianess seront traitées ultérieurement.
Si la locale par défaut n'est pas garantie pour passer à travers ce genre de choses sans être modifiée sur une certaine configuration du système (je ne sais pas, arabe ou autre), alors quelle est la meilleure façon d'écrire des fichiers binaires en utilisant C++ ?