C ++使用该streamoff
类型表示(文件)流中的偏移量,并在[stream.types]中定义如下:
using streamoff = implementation-defined ;
类型streamoff是已签名的基本整数类型之一的同义词,该基本整数类型的大小足以表示操作系统的最大可能文件大小。287)
287)通常很长很长。
这是有道理的,因为它允许在大型文件中进行查找(与使用相比long
,后者可能只有32位宽)。
[filebuf.virtuals]定义了basic_filebuf
在文件中进行搜索的功能,如下所示:
pos_type seekoff(off_type off, ios_base::seekdir way, ios_base::openmode which = ios_base::in | ios_base::out) override;
off_type
等价于streamoff
,请参见[iostreams.limits.pos]。但是,该标准随后继续说明了该功能的作用。最后一句话让我很生气,这需要调用fseek
:
效果:
width
表示a_codecvt.encoding()
。如果is_open() == false
是或off != 0 && width <= 0
,则定位操作将失败。否则,如果way != basic_ios::cur
或off != 0
,并且输出了最后一个操作,则更新输出序列并写入所有未移位序列。接下来,寻找新的位置:ifwidth > 0
,请致电fseek(file, width * off, whence)
,否则请致电fseek(file, 0, whence)
。
fseek
接受long
参数。如果off_type
和streamoff
被定义为long long
(如标准所建议),则可能导致向下转换为long
调用时fseek(file, width * off, whence)
(导致可能难以诊断的错误)。这使人们质疑streamoff
首先引入该类型的全部理由。
这是故意的还是标准的缺陷?
seekoff
不一定必须在引擎盖下使用 fseek
。而是,(大概很熟悉?)的行为fseek
用来解释seekoff
正在做什么。
fseek
只要它执行具有相同效果的操作,它实际上就不必调用。但是fseek
,如果偏移量小于LONG_MIN
或大于LONG_MAX
无效,则说明至多是不完整的,至少对于streamoff
宽于的实现而言long
。