fseek的行为与SEEK_END和正偏移?

问题描述 投票:-1回答:2

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

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

我们可以做read(fd, some_buffer, 5)从文件中读取缓冲区中的5个值。

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

我的问题是,当我们使用具有正偏移量的fseek时,SEEK_END的行为是什么?这种行为是未定义的,还是环绕到文件内容的前面?

所以,如果我们做了fseek(fd, 5, SEEK_END),那么指针指向哪里呢?

c fseek
2个回答
1
投票

我的问题是,当我们使用具有正偏移量的fseek时,SEEK_END的行为是什么?这种行为是未定义的,还是环绕到文件内容的前面?

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

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

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

对于二进制流,

以文件开头的字符为单位测量的新位置是通过向whence指定的位置添加偏移量获得的

C2011, 7.21.9.2/3),所以不,它绝对不会缠绕。标准接着说

二进制流不需要有意义地支持fseek调用,其值为SEEK_END

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

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


0
投票

为什么不读documentation

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

© www.soinside.com 2019 - 2024. All rights reserved.