我目前正在使用c ++并尝试使用fseek()编写文件,以便写入从其他方法计算的给定偏移量。只是想知道如果给定的偏移量会使FILE指针超出文件中的最后一个字符会发生什么。
实施例: 在" abcdefg"的文件中作为内容,fseek(someFILEpointer,20,SEEK_SET)将返回什么?
答案 0 :(得分:3)
来自cppreference:
POSIX允许在现有文件末尾之外进行搜索。如果在此搜索之后执行输出,则从间隙读取的任何内容将返回零字节。在文件系统支持的情况下,这将创建一个稀疏文件。
听起来它应该返回非错误状态,但后续读取可能会失败。后续写入可能会成功,但确切的行为可能取决于底层文件系统。
答案 1 :(得分:1)
在linux(以及一般的unix)中,它会成功并返回从文件开头开始测量的新偏移量,但是在你在该偏移处写入内容之前,文件的大小不会增加。
您的未写入部分将从文件中读回为零,但根据操作系统和文件系统,某些零可能不必占用硬盘上的空间。
答案 2 :(得分:1)
C标准使其实现定义是否对fseek
的此类调用成功。如果无法以指示的方式设置文件位置,fseek
将返回错误指示。
来自C标准:
二进制流无需支持具有
fseek
值的SEEK_END
次调用。 (§7.21.9.2/ 3)对于文本流,偏移量应为零,或者offset应为先前成功调用与同一文件关联的流上的
ftell
函数返回的值,并且应为{{1} }。
因此,在任何情况下,您都无法保证能够使用非零偏移调用SEEK_SET
并将其设置为fseek
。
Posix允许通话(来自description of fseek
的引用):
SEEK_END
函数应允许将文件位置指示符设置为超出文件中现有数据的末尾。如果此时稍后写入数据,则后续读取间隙中的数据应返回值为0的字节,直到数据实际写入间隙为止。
(Posix将实现,无论具有值0的字节是否实际存储,或者是隐式的。大多数Unix文件系统实现稀疏文件,可以通过不在永久存储上存储零来优化这种情况,但这不是例如,可以在FAT文件系统上使用。)
即使Posix也只为常规文件提供此保证:
fseek()
在无法寻找的设备上的行为是实现定义的。与此类设备关联的文件偏移值未定义。
因此调用可能会失败,但这不是未定义的行为。如果无法重新定位,fseek()
将返回非零值;对于Posix实现,非零值将为fseek
,-1
将设置为可能有助于澄清失败原因的值。