14

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

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

而且,顺便说一句,我知道fgetpos/fsetpos 和 ftell/fseek 之间有什么区别,但这不是重复的。该问题询问有关 ftell/fseek 的问题,而答案不适用于 ftello/fseeko。

4

1 回答 1

10

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

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

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

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

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

于 2012-08-25T04:33:39.433 回答