假设我们有一个包含字符串“0123456789”的文件“x”。
我们打开文件并有一个文件描述符fd
。
我们可以做read(fd, some_buffer, 5)
从文件中读取缓冲区中的5个值。
同样,我们可以使用fseek将指针移动到文件中的各个条目。
我的问题是,当我们使用具有正偏移量的fseek
时,SEEK_END
的行为是什么?这种行为是未定义的,还是环绕到文件内容的前面?
所以,如果我们做了fseek(fd, 5, SEEK_END)
,那么指针指向哪里呢?
我的问题是,当我们使用具有正偏移量的
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在文本和二进制流之间在实践中没有任何区别。
为什么不读documentation?
POSIX允许在现有文件末尾之外进行搜索。如果在此搜索之后执行输出,则从间隙读取的任何内容将返回零字节。在文件系统支持的地方,这会创建一个稀疏文件。