ftello/fseeko与fgetpos/fsetpos的区别

14

ftello/fseekofgetpos/fsetpos之间有什么区别?两者都是文件指针获取/设置函数,使用不透明偏移类型来允许64位偏移。

它们是否在不同的平台上或由不同的标准支持?其中一个在所使用的偏移类型方面更加灵活吗?

顺便说一下,我知道fgetpos / fsetpos和ftell / fseek之间的区别,但这并不是重复的。那个问题问的是ftell / fseek,并且答案不能应用于ftello / fseeko。


请注意,ftello 返回的 off_t 实际上不是一个不透明的数据类型;它只是一个带符号的整数。根据您的平台和编译标志,它可能是32位或64位。同样,如果 _FILE_OFFSET_BITS != 64,则 fpos_t 可能不是64位。 - nneonneo
我猜我所说的不透明数据类型是指它在用户的代码中不是固定类型。我想这并不完全是不透明的,因为数据类型只能在编译时而非动态链接时更改。 - Jeremy Salwen
2
啊,我通常使用opaque来表示“具有非公共布局的结构”,就像fpos_t一样。 - nneonneo
1个回答

11
请参考“可移植定位”以了解差异的详细信息。其中摘录如下: 在一些系统中,文本流与二进制流确实有所不同,因此无法将文本流的文件位置表示为从文件开头开始的字符数量。例如,在某些系统上,文件位置必须同时编码文件内的记录偏移量和记录内的字符偏移量。 因此,如果您希望程序可以移植到这些系统上,请遵循以下规则: 1.在文本流上调用ftell返回的值与已读取的字符数之间没有可预测的关系。您唯一可以依靠的是,可以随后使用它作为fseek或fseeko的偏移参数来返回相同的文件位置。 2.在对文本流进行fseek或fseeko调用时,偏移必须为零,或者whence必须为SEEK_SET且偏移量必须是先前对同一流进行ftell调用的结果。 3.文本流的文件位置指示器的值在存在使用ungetc推回但未读取或放弃的字符时是未定义的。请参见Unreading。 简而言之:使用fgetpos/fsetpos可以使用更灵活的结构存储文件位置状态的其他元数据,理论上实现更高的可移植性。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接