ftello / fseeko vs fgetpos / fsetpos

时间:2012-08-25 04:23:46

标签: c file-io fseek ftell fgetpos

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

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

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

1 个答案:

答案 0 :(得分:9)

有关差异的详细信息,请参阅Portable Positioning。摘录:

  

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

     

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

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

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