C++ 关于fsetpos、C和x2B的澄清+;
我对stdio.h库中的函数fsetpos有点困惑。我希望写入文件中的不同索引(即不希望连续写入文件)。我正在考虑使用fsetpos,但文档中指出C++ 关于fsetpos、C和x2B的澄清+;,c++,cstdio,C++,Cstdio,我对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 previ
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的呼叫设置位置对我来说没有意义。这有什么意义,因为它只是将它设置到它已经设置的位置。或者我没有正确理解它?根据C11标准,
fseek
也有类似的限制:
对于文本流,offset
应为零,或者offset
应为先前成功调用与同一文件关联的流上的ftell
函数返回的值,并且从何处SEEK\u SET
原因是文本流在源的实际字节和从fgetc
获得的字节之间没有一对一的映射;e、 在windows系统上,C中的换行符往往被翻译成两个二进制字符的序列:回车,然后换行
因此,基于数字索引任意定位文本流的概念充满了复杂和意外
事实上,ftell
的文档发出了警告
对于文本流,其文件位置指示器包含未指定的信息,可由fseek
函数使用,用于将流的文件位置指示器返回到调用ftell
时的位置;两个这样的返回值之间的差异不一定是对写入或读取的字符数的有意义的度量
但是,二进制流没有这个限制
二进制流不需要有意义地支持whence值为SEEK\u END的fseek
调用
以上假设您使用的是面向字节的流。宽定向流有额外的限制。e、 g.在流下
:
面向二进制范围的流具有文本流和二进制流的文件定位限制
及
对于宽方向流,在成功调用文件定位函数(该函数在文件结束之前离开文件位置指示符)后,宽字符输出函数可以覆盖部分多字节字符;此后,写入的字节以外的任何文件内容都是不确定的
fsetpos
不仅仅是设置文件位置:同样来自C11标准:
fsetpos
功能设置mbstate\u t
对象(如果有)和文件位置指示器
这使得它更适合在广泛的定向流中设置位置。更多详细信息,请添加代码…如果找到答案,请编写答案。