0

我对 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 的调用来设置位置对我来说没有意义。有什么意义,因为它只会将其设置为已经设置的位置。或者我没有正确理解它?

4

1 回答 1

0

从 C11 标准来看,fseek有类似的限制:

对于文本流,要么offset为零,要么offset是先前成功调用ftell与同一文件关联的流上的函数返回的值,并且whence应为SEEK_SET

原因是文本流在源的实际字节和您从中获得的字节之间没有一对一的映射fgetc;例如,在 Windows 系统上,C 中的换行符倾向于被翻译成两个二进制字符的序列:回车,然后换行。

因此,基于数字索引任意定位文本流的概念充满了复杂性和意外性。

事实上,ftell警告的文档

对于文本流,其文件位置指示符包含未指定的信息,fseek函数可使用该信息将流的文件位置指示符返回到ftell调用时的位置;两个这样的返回值之间的差异不一定是衡量写入或读取字符数的有意义的量度。

二进制流没有这个限制,虽然

二进制流不需要有意义地支持fseekwherece 值的调用SEEK_END


以上假设您正在使用面向字节的流。面向宽的流有额外的限制。例如在Streams

面向广泛的二进制流具有归因于文本流和二进制流的文件定位限制

对于面向宽的流,在成功调用文件定位函数后,在文件结束之前离开文件位置指示符,宽字符输出函数可以覆盖部分多字节字符;任何超出写入字节的文件内容都将是不确定的

fsetpos不仅仅是设置文件位置:再次来自 C11 标准:

fsetpos函数设置mbstate_t对象(如果有)和文件位置指示符

这使得它更适合在面向宽的流中设置位置。

于 2015-11-03T13:22:12.993 回答