如果 fseek 中的给定偏移量超出最后一个字符会发生什么
What will happen if the given offset in fseek goes beyond the last character
我目前正在使用 c++ 并尝试使用 fseek(( 编写文件,以便写入从其他方法计算的给定偏移量。只是想知道如果给定的偏移量会使 FILE 指针超出文件中的最后一个字符会发生什么。
例:在以"abcdefg"作为内容的文件中,fseek(someFILEpointer,20,SEEK_SET(将返回什么?
来自 cpp首选项:
POSIX 允许在文件末尾之外进行查找。如果在此搜索之后执行输出,则从间隙读取的任何内容都将返回零字节。在文件系统支持的情况下,这将创建一个稀疏文件。
听起来它应该返回非错误状态,但后续读取可能会失败。 后续写入可能会成功,但确切的行为可能取决于底层文件系统。
C 标准保留了对 fseek
的实现定义,无论这种对的调用是否成功。如果无法按指示的方式设置文件位置,fseek
将返回错误指示。
从 C 标准:
二进制流不需要有意义地支持值为
对于文本流,偏移量应为SEEK_END
的fseek
调用。(§7.21.9.2/3(零,或者偏移量应为与同一文件关联的流上对
ftell
函数的早期成功调用返回的值,并且应SEEK_SET
。
因此,在这两种情况下,您都不能保证能够以非零偏移量调用fseek
,并因此设置为 SEEK_END
。
Posix确实允许调用(引用fseek
的描述(:
fseek()
功能应允许在文件中现有数据的末尾之外设置文件位置指示器。如果稍后在此写入数据,则在间隙中对数据的后续读取应返回值为 0 的字节,直到数据实际写入间隙。
(Posix 将值为 0 的字节是实际存储还是隐式存储取决于实现。大多数Unix文件系统实现稀疏文件,可以通过不将零存储在持久存储上来优化这种情况,但这在FAT文件系统上是不可能的,例如。
甚至 Posix 也只对常规文件做出此保证:
无法查找的设备上
fseek()
的行为是实现定义的。与此类设备关联的文件偏移量的值未定义。
因此,调用可能会失败,但这不是未定义的行为。如果无法重新定位,fseek
将返回非零值;在 Posix 实现的情况下,非零值将被-1
,errno
值将设置为可能有助于澄清失败原因的值。
在 linux(以及一般的 unix(中,它会成功并返回从文件开头测量的新偏移量,但在您以该偏移量写入内容之前,文件的大小不会增加。
未写入的部分将从文件中读回为零,但根据操作系统和文件系统的不同,某些零可能不必占用硬盘驱动器上的空间。
- 使用连续分隔符和空最后一个字符进行拆分
- CPP:如何获取字符的最后一个索引
- 如何检查字符串中的最后一个字符是否是某个字符并将其从字符串中删除?(C++)
- 比较最后一个字符,不区分大小写(带谓词?
- 在弦乐器中删除最后一个字符
- 输入文件中的第一个字符是输出文件中的最后一个字符,反之亦然
- 在C 字符串中,为什么在最后一个字符之后,通过索引和()访问索引时行为是不同的
- 如何查看复杂度为 O(1) 的字符串流对象中的最后一个字符
- 最后一个字符行编辑
- 如何在C 中获得字符串的最后一个字符
- 从字符串中删除字符的第一个和最后一个实例
- 删除文件 C++ 中字符串中最后一个出现的字符
- 如何在C++中删除 UTF-8 字符串的最后一个字符
- 如何将文本(诗歌)拆分为行(字符串/字符[])并查找每个行的最后一个单词
- 如何获取输入文件的行的第二个和最后一个字符,并在C++中组成数组
- 输出流中的第一个字符将替换为该流中被删除的最后一个字符.为什么会这样
- 正在将最后一个字符发送到std::cout
- 获取字符串流中的最后一个字符,而不复制其整个缓冲区
- remove_if字符串中的最后一个字符
- 如何删除最后一个字符