fseek() 在我期望相同的计数时给出 2 个不同的计数

fseek() giving 2 different counts when I expected the same count

提问人:DrBwts 提问时间:2/17/2023 更新时间:2/17/2023 访问量:66

问:

如果我使用

fseek(file_ptr, 0, SEEK_END);
size = ftell(file_ptr);

我明白了什么是正确的,因为我在文件中每个 8 个字节处有 x。48000060000double floatdouble

但是当我使用

fseek(file_ptr, sizeof(double), SEEK_END);
size = ftell(file_ptr); 

我得到了额外的 8 个字节。有人知道它们是什么吗?480008

c fseek

评论

7赞 Jabberwocky 2/17/2023
sizeof(double)和不一样,那你为什么期待同样的结果呢?0
4赞 Some programmer dude 2/17/2023
大多数文件系统都支持在文件末尾之外进行搜索。这可以放大文件,也可以添加一个孔
0赞 DrBwts 2/17/2023
@Jabberwocky我希望两者都移动到文件的末尾
1赞 Ted Lyngmo 2/17/2023
@DrBwts 您使用的是哪个手册页?您的目标平台是什么?如果该手册页是错误的,或者它不是目标平台的正确手册页,那么尝试更新该手册页可能是件好事。fseekfseek

答:

3赞 Harith 2/17/2023 #1

但是当我使用

fseek(file_ptr, sizeof(double), SEEK_END);
size = ftell(file_ptr); 

我得到480008额外的 8 个字节

这是因为系统上 a 的大小为 8 个字节,并将文件位置指示器设置为 8 个字节。doublefseek()SEEK_END

新位置(以字节为单位)是通过添加偏移量获得的 bytes 设置为 whence 指定的位置。


再:

有人知道它们是什么吗?

这是开放组的手册页对它的看法:

fseek() 函数应允许设置文件位置指示器 超出文件中现有数据的末尾。如果稍后写入数据 此时,GAP 中数据的后续读取应返回字节 值为 0,直到数据实际写入间隙。

fseek() 在无法搜索的设备上的行为是 实现定义。与 关联的文件偏移量的值 这样的设备是未定义的。

请注意,此行为仅针对符合 POSIX 标准的系统指定。

1赞 Roberto Caboni 2/17/2023 #2

答案在 fseek() 手册页(Linux 操作系统)中。

函数原型是

int fseek(FILE *stream, long offset, int whence);

其中参数说明如下offset

新位置(以字节为单位)是通过将偏移字节添加到 指定的位置来获得的。whence

由于您的偏移量是 8(在您的系统中)并且原始文件大小是 480000,因此您得到480008。sizeof double

本手册从未提及任何阻止在 之后设置指针的限制。SEEK_END