ftello / fseeko vs fgetpos / fsetpos

Quelle est la difference entre ftello / fseeko et fgetpos / fsetpos? Les deux semblent être des fonctions d’obtention / définition de pointeur de fichier qui utilisent des types de décalage opaques pour permettre parfois des décalages de 64 bits.

Sont-ils pris en charge sur différentes plates-formes ou par des normes différentes? Le type de décalage utilisé est-il plus flexible?

Et, soit dit en passant, je suis conscient de fgetpos / fsetpos et ftell / fseek , mais ce n’est pas un doublon. Cette question concerne ftell / fseek, et la réponse ne s’applique pas à ftello / fseeko.

Voir Positionnement portable pour des informations détaillées sur la différence. Un extrait:

Sur certains systèmes où les stream de texte diffèrent vraiment des stream binarys, il est impossible de représenter la position du fichier d’un stream de texte sous la forme d’un nombre de caractères à partir du début du fichier. Par exemple, la position du fichier sur certains systèmes doit coder à la fois un décalage d’enregistrement dans le fichier et un décalage de caractère dans l’enregistrement.

Par conséquent, si vous souhaitez que vos programmes soient portables sur ces systèmes, vous devez respecter certaines règles:

  • La valeur renvoyée par ftell sur un stream de texte n’a pas de relation prévisible avec le nombre de caractères que vous avez lus jusqu’à présent. La seule chose sur laquelle vous pouvez compter est que vous pouvez l’utiliser par la suite comme argument offset pour fseek ou fseeko pour revenir à la même position dans le fichier.
  • Dans un appel à fseek ou à fseeko sur un stream de texte, le décalage doit être égal à zéro ou à partir de SEEK_SET et le décalage doit être le résultat d’un appel précédent à ftell sur le même stream.
  • La valeur de l’indicateur de position du fichier d’un stream de texte est indéfinie, alors que certains caractères qui ont été repoussés avec ungetc n’ont pas été lus ni ignorés. Voir la lecture.

En bref: fgetpos / fsetpos utilise une structure plus flexible pour stocker des métadonnées supplémentaires sur l’état de la position du fichier, permettant une plus grande portabilité (en théorie).