如果fseek中的给定偏移量超出最后一个字符,会发生什么

时间:2016-02-15 21:26:31

标签: c++

我目前正在使用c ++并尝试使用fseek()编写文件,以便写入从其他方法计算的给定偏移量。只是想知道如果给定的偏移量会使FILE指针超出文件中的最后一个字符会发生什么。

实施例: 在" abcdefg"的文件中作为内容,fseek(someFILEpointer,20,SEEK_SET)将返回什么?

3 个答案:

答案 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将设置为可能有助于澄清失败原因的值。