假设我们有一个包含字符串“ 0123456789”的文件“ x”。
我们打开文件并有一个文件描述符fd
。
我们可以执行read(fd, some_buffer, 5)
来从文件中读取5个值。
类似地,我们可以使用fseek将指针移动到文件中的各个条目。
我的问题是,当我们将fseek
用于正偏移时,SEEK_END
的行为是什么?这个行为是未定义的,还是环绕在文件内容的最前面?
因此,如果我们执行了fseek(fd, 5, SEEK_END)
,则指针现在指向何处?
答案 0 :(得分:1)
我的问题是,当我们使用
fseek
时SEEK_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允许查找超出文件的现有末尾。如果输出是 执行此搜索后,从间隙读取的任何内容都将返回零 个字节。在文件系统支持的地方,这会创建一个稀疏文件。