我对stdio.h库中的函数 fsetpos 有点困惑。我想在文件中写入不同的索引(即不想连续写入文件)。我正在考虑使用fsetpos,但文档说明..
The internal file position indicator associated with stream is set to the position
represented by pos, which is a pointer to an fpos_t object whose value shall have been
previously obtained by a call to fgetpos.
我必须根据来自fgetpos的电话设置位置,这对我来说没有意义。什么是重点,因为它只是将它设置到它已经设置的位置。或者我不正确地理解它?
答案 0 :(得分:0)
根据C11标准,fseek
有类似的限制:
对于文本流,
offset
应为零,或offset
应为先前成功调用与同一文件关联的流上的ftell
函数返回的值whence
应为SEEK_SET
原因是文本流在源的实际字节和从fgetc
获得的字节之间没有一对一的映射;例如在Windows系统上,C中的换行符往往被翻译成两个二进制字符的序列:回车,然后换行。
因此,基于数字索引任意定位文本流的概念充满了复杂性和惊喜。
事实上,ftell
的文档警告
对于文本流,其文件位置指示符包含未指定的信息,
fseek
函数可将其用于将流的文件位置指示符返回到ftell
调用时的位置;两个这样的返回值之间的差异不一定是写入或读取的字符数的有意义的度量。
二进制流不具备此限制,但
二进制流无需支持具有
值的fseek
SEEK_END
次调用
以上假设您正在使用面向字节的流。面向广播的流有额外的限制。例如在Streams
下:
二进制宽向导流具有归因于文本和二进制流的文件定位限制
和
对于面向广泛的流,在成功调用文件定位函数(在文件结尾之前离开文件位置指示符)之后,宽字符输出函数可以覆盖部分多字节字符;写入的字节之外的任何文件内容从此不确定
fsetpos
不仅仅是设置文件位置:再次来自C11标准:
fsetpos
函数设置mbstate_t
对象(如果有)和文件位置指示符
这使得它更适合在面向广的流中设置位置。