具有SEEK_END和正偏移的fseek的行为?

时间:2019-04-17 18:43:15

标签: c fseek

假设我们有一个包含字符串“ 0123456789”的文件“ x”。

我们打开文件并有一个文件描述符fd

我们可以执行read(fd, some_buffer, 5)来从文件中读取5个值。

类似地,我们可以使用fseek将指针移动到文件中的各个条目。

我的问题是,当我们将fseek用于正偏移时,SEEK_END的行为是什么?这个行为是未定义的,还是环绕在文件内容的最前面?

因此,如果我们执行了fseek(fd, 5, SEEK_END),则指针现在指向何处?

2 个答案:

答案 0 :(得分:1)

  

我的问题是,当我们使用fseekSEEK_END的行为是什么   有一个正的偏移量?此行为是未定义的还是包装   在文件内容的最前面?

如果流是 text 流,那么就C语言而言,该行为是未定义的,因为标准规定:

  

对于文本流,offset应该为零,或者offset应该为   先前成功调用ftell函数返回的值   与相同文件关联的流上,whence应该是   SEEK_SET

C2011, 7.21.9.2/4)。没有为非零偏移量和SEEK_END的组合定义任何行为。

对于二进制流,

  

新位置,以字符开头的字符为单位   文件,是通过将offset添加到指定的位置获得的   whence

C2011, 7.21.9.2/3),所以不,它绝对不会环绕。标准继续说

  

二进制流不需要使用来有意义地支持fseek调用   SEEK_END

的值

,因此您所描述的这种调用可能(定义上)可能会失败,并返回错误代码。但是,如果它确实成功了(并且对于某些实现,可以预期对于某些流来说也是如此),那么它将导致文件位置超过文件末尾。尝试在这样的位置进行读取应该具有与该位置处于EOF相同的结果。尝试写入的行为取决于文件的打开模式(对以追加模式打开的流的所有写操作都将到达文件的当前末尾)和实现。

例如,在POSIX系统上,系统的C实现被指定为允许将与常规文件关联的流定位到文件末尾,并且成功地在该位置进行写入的行为就好像写入了值为0的字节一样。到文件的上一个结束之间的所有位置。此外,POSIX实际上在文本流和二进制流之间没有任何区别。

答案 1 :(得分:0)

为什么不读documentation

  

POSIX允许查找超出文件的现有末尾。如果输出是   执行此搜索后,从间隙读取的任何内容都将返回零   个字节。在文件系统支持的地方,这会创建一个稀疏文件。