ftello / fseeko vs fgetpos / fsetpos

ftello / fseeko和fgetpos / fsetpos有什么区别? 两者似乎都是文件指针获取/设置function,使用不透明偏移类型有时允许64位偏移。

它们是在不同平台上支持还是由不同标准支持? 它使用的偏移类型是否更灵活?

顺便说一句,我知道fgetpos / fsetpos和ftell / fseek ,但这不是重复的。 那个问题询问ftell / fseek,答案不适用于ftello / fseeko。

有关差异的详细信息,请参阅便携式定位 。 摘录:

在文本流与二进制流真正不同的某些系统上,不可能将文本流的文件位置表示为文件开头的字符数。 例如,某些系统上的文件位置必须编码文件中的记录偏移量和记录中的字符偏移量。

因此,如果您希望程序可以移植到这些系统,则必须遵守以下规则:

  • 从文本流上的ftell返回的值与到目前为止已读取的字符数没有可预测的关系。 您可以依赖的唯一事情是您可以随后将其用作fseek或fseeko的偏移参数以移回到相同的文件位置。
  • 在文本流上调用fseek或fseeko时,偏移量必须为零,或者必须为SEEK_SET,并且偏移量必须是先前在同一流上调用ftell的结果。
  • 文档流的文件位置指示符的值是未定义的,而有些字符已使用ungetc推回但尚未读取或丢弃。 见未读。

简而言之:fgetpos / fsetpos使用更灵活的结构来存储有关文件位置状态的其他元数据,从而实现更高的可移植性(理论上)。