为什么ftell的返回类型不是fpos_t?

now*_*wox 13 c c99

根据C99,其原型为ftell

long int ftell(FILE *stream);
Run Code Online (Sandbox Code Playgroud)

根据我的理解,应该改为以下内容:

fpos_t ftell(FILE *stream);
Run Code Online (Sandbox Code Playgroud)

这是为什么?

从§7.19.1-2起

fpos_t 它是对象类型,而不是能够记录唯一地指定文件中每个位置所需的所有信息的数组类型。

我知道fpos_t应该使用该记录文件中的位置。因此ftell,返回文件中位置的位置应为该类型。相反,它是:

  • signed
  • 类型long,可能太小或太大而无法在某些体系结构上访问文件。

Ant*_*ala 13

注意fpos_t

完整的对象类型,而不是数组类型,能够记录唯一地指定文件中每个位置所需的所有信息。

因此它甚至可以是一个结构,除了调用之外,对于其他任何东西都完全无法使用fsetpos

另一方面,返回值ftell是一个标量,可以保证在标出二进制文件中确切的字节位置时使用该标量:

对于二进制流,该值是从文件开头开始的字符数。


除此之外,原因是向后兼容ftell首次出现在C89中,也许当时的期望是,它long可以足够快速地扩展以容纳所有文件大小,这在当今并不总是正确的。不幸的是,无法更改返回的类型,ftell但现在更改现在为时已晚-甚至那些支持较大文件的平台现在都具有使用其他名称的功能,例如ftello


需要签名,因为该函数将-1在错误时返回。


Ctx*_*Ctx 6

从的联机帮助页fgetpos()/fsetpos()

在某些非UNIX系统上,fpos_t对象可能是一个复杂的对象,并且这些例程可能是可移植地重新定位文本流的唯一方法。

ftell()需要返回文件指针在文件中的偏移量。这些是完全不同的接口。