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

What will happen if the given offset in fseek goes beyond the last character

本文关键字:字符 最后一个 什么 fseek 偏移量 如果      更新时间:2023-10-16

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

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

来自 cpp首选项:

POSIX 允许在文件末尾之外进行查找。如果在此搜索之后执行输出,则从间隙读取的任何内容都将返回零字节。在文件系统支持的情况下,这将创建一个稀疏文件。

听起来它应该返回非错误状态,但后续读取可能会失败。 后续写入可能会成功,但确切的行为可能取决于底层文件系统。

C 标准保留了对 fseek 的实现定义,无论这种对的调用是否成功。如果无法按指示的方式设置文件位置,fseek将返回错误指示。

从 C 标准:

二进制流不需要有意义地支持值为 SEEK_ENDfseek 调用。(§7.21.9.2/3(

对于文本流,偏移量应为

零,或者偏移量应为与同一文件关联的流上对 ftell 函数的早期成功调用返回的值,并且应SEEK_SET

因此,在这两种情况下,您都不能保证能够以非零偏移量调用fseek,并因此设置为 SEEK_END

Posix确实允许调用(引用fseek的描述(:

fseek()功能应允许在文件中现有数据的末尾之外设置文件位置指示器。如果稍后在此写入数据,则在间隙中对数据的后续读取应返回值为 0 的字节,直到数据实际写入间隙。

(Posix 将值为 0 的字节是实际存储还是隐式存储取决于实现。大多数Unix文件系统实现稀疏文件,可以通过不将零存储在持久存储上来优化这种情况,但这在FAT文件系统上是不可能的,例如。

甚至 Posix 也只对常规文件做出此保证:

无法查找的设备上fseek()的行为是实现定义的。与此类设备关联的文件偏移量的值未定义。

因此,调用可能会失败,但这不是未定义的行为。如果无法重新定位,fseek将返回非零值;在 Posix 实现的情况下,非零值将被-1errno值将设置为可能有助于澄清失败原因的值。

在 linux(以及一般的 unix(中,它会成功并返回从文件开头测量的新偏移量,但在您以该偏移量写入内容之前,文件的大小不会增加。

未写入的部分将从文件中读回为零,但根据操作系统和文件系统的不同,某些零可能不必占用硬盘驱动器上的空间。