不完全的。可以从Beej找到线索:
在几乎每个系统(当然还有我所知道的每个系统)上,人们都不使用这些函数,而是使用 ftell() 和 fseek()。这些函数的存在是为了以防您的系统无法将文件位置记住为简单的字节偏移量。
和Linux 手册页:
在某些非 UNIX 系统上,fpos_t 对象可能是一个复杂对象,而这些例程可能是可移植地重新定位文本流的唯一方法。
在Windows上:
它假定缓冲区中的任何 \n 字符最初都是一个 \r\n 序列,当数据被读入缓冲区时,该序列已被规范化。
也就是说,不是(Windows-linebreak)文本文件的文件在以文本模式打开时在 Windows 中出错,因为fsetpos
假设该文件确实是(Windows-linebreak)文本文件,因此不能包含\n
带有 no的 a \r
。
C11 标准说(我的重点):
7.21.2/6:
每个面向宽的流都有一个关联的 mbstate_t 对象,该对象存储流的当前解析状态。对 fgetpos 的成功调用会将此 mbstate_t 对象的值的表示存储为 fpos_t 对象的值的一部分。稍后使用相同存储的 fpos_t 值成功调用 fsetpos 会恢复关联的 mbstate_t 对象的值以及受控流中的位置。
请注意,fseek
对对象ftell
无话可说mbstate_t
:他们不报告或恢复它。因此,在面向宽的流(也就是说,您使用面向宽的 I/O 函数的流)上,它们只会重置文件位置,而不是(如果实现实际上具有多个可能的mbstate_t
对象值)流的整个状态。
面向宽的流与文本流不同,只是读取宽文本文件是它们的常见用途。实际上fseek
并且ftell
被记录为能够在文本文件上重置文件位置,前提是您正确使用它们。所以我相信(我可能错了),fsetpos
并且fgetpos
只有在流上使用宽 I/O 函数时才需要。