Je travaille sur un problème de programmation des perles - en particulier, la mise en œuvre d'un programme qui trie un fichier contenant, au plus, 10 000 000 entiers (colonne 1, problème 3). Étant donné que le livre ne précise pas comment les données doivent être stockées dans le fichier, j'envisage de stocker les entiers sous forme d'octets bruts (il existe d'autres contraintes qui font des octets bruts une bonne option). Je n'ai jamais travaillé à ce niveau inférieur auparavant, donc je veux savoir s'il y a quelque chose de dangereux à surveiller. Dois-je m'inquiéter de l'utilisation accidentelle d'une sorte de séquence de fin de fichier lorsque j'écris des octets bruts dans un fichier, par exemple?
Éditer:
Je réalise maintenant à quel point ma question était large. Je voulais vraiment dire des problèmes plus catastrophiques, comme écraser accidentellement d'autres fichiers sur le disque. Désolé, je n'étais pas plus clair à l'origine.
Réponses:
Le seul danger que vous rencontrerez est le petit ou le gros caractère (que l'octet le plus ou le moins significatif soit écrit en premier). Cependant, si vous restez dans le même environnement, il n'y aura aucun problème. outre la garantie générale d'écriture / analyse de l'aller-retour.
Le système de fichiers est conçu pour gérer n'importe quelle séquence d'octets.
la source
Non, c'est en fait le nombre de formats de fichiers qui fonctionnent. Des exemples courants de fichiers binaires comme celui-ci incluent des images et des fichiers audio / musicaux.
Pour maintenir l'intégrité du fichier et des données qui y sont lues, veillez à suivre ces instructions:
Les détails spécifiques varieront en fonction du cadre, de la plate-forme et du langage, mais cela devrait couvrir les "pièges" de base avec les E / S de fichiers.
la source
int
peut être n'importe où entre 2 et 8 octets ou plus (octets vraiment).int
sur deux machines différentes puissent être considérées comme des types de données différents.En plus de tous les pièges déjà mentionnés, si vous créez un nouveau format de fichier binaire plutôt que de lire et d'écrire des données dans un format existant, il est absolument vital d'inclure un en-tête de fichier : un bloc de données au tout début du fichier qui identifie sans ambiguïté le format de fichier et enregistre toutes les métadonnées qui peuvent être nécessaires.
Les bons en-têtes de fichiers comprennent au moins trois éléments:
Un " nombre magique ", d'au moins quatre octets. Le nombre magique DOIT rfc2119 être les tout premiers N octets du fichier, NE DOIT jamais avoir été utilisé pour tout autre format de fichier que vous pouvez rechercher, et DOIT contenir au moins un octet qui n'est pas un caractère ASCII imprimable. Voir la spécification PNG pour savoir comment concevoir un nombre magique vraiment complet . Voir le code source de la
file(1)
commande pour une base de données de nombres magiques existants qui est aussi complète que vous êtes susceptible de trouver.L'intérêt d'un nombre magique est d'étiqueter sans ambiguïté le fichier, dans la bande, avec son format. Si vous n'incluez pas de nombre magique, ou si ce n'est pas la toute première chose dans le fichier, vous courez le risque que des programmes identifient mal votre fichier comme un autre type de fichier, ce qui entraîne une perte de données, des virus échappant à la détection , etc. catastrophes.
Une indication de la version du format de fichier. Même si vous pensez que vous n'aurez jamais à réviser votre format de fichier de manière drastique, faites les deux octets suivants après le nombre magique
00 00
et documentez qu'il s'agit d'un numéro de version 16 bits dans une certaine finesse définie (selon ce que vous voulez, mais choisissez un et respectez-le tout au long du fichier ) et sera incrémenté si la signification des données suivantes change radicalement. Votre futur moi vous remerciera.(La spécification PNG prend un itinéraire différent ici, spécifiant que les formats de bloc sont figés et que toutes les futures modifications du format prendront la forme de nouveaux types de bloc. C'est également valide, mais je recommande l'approche simple du nombre magique + du numéro de version pour les débutants au traitement de données binaires. Les concepteurs de PNG s'appuyaient sur des décennies d'expérience collective avec les formats d'image.)
Une sorte de mécanisme pour incorporer des métadonnées arbitraires dans le fichier. Cela peut être aussi simple que d' avoir les prochains deux octets être un 16 bits décalé par rapport à la fin de l' en- tête au début des données réelles, avec tout le reste à interpréter comme paires UTF-8 clé-valeur une RFC la 822 (c'est-à-dire "
Tag: value\n
" - si vous suivez cette voie, je recommande de ne pas autoriser le pliage de longues lignes). Encore une fois, PNG est considérablement plus intelligent.la source
Différentes architectures ont des représentations différentes pour les entiers. Le principal risque ici est d'enregistrer la représentation en octets d'un entier dans la machine A, puis d'essayer de le lire et d'interpréter le contenu comme des entiers dans la machine B.Si les machines A et B ont des tailles différentes pour les entiers et / ou une endianité différente , vous '' ll provoquera très probablement un comportement indéfini (par exemple en C) ou une exception.
Comme ce n'est qu'un exemple de programmation et non un "vrai" programme, ce n'est pas vraiment un problème. S'il s'agissait d'un vrai programme, rouler votre propre format binaire spécifique à l'application n'est généralement pas une bonne idée; il existe de meilleures solutions, comme SQLite ou des formats de sérialisation basés sur des chaînes comme JSON, YAML, XML, etc. Pour des valeurs uniques, la transformer en chaîne suffirait; pour les listes simples, vous pouvez enregistrer une chaîne par ligne et simplement diviser l'entrée sur les nouvelles lignes lorsque vous la relisez.
la source