为何fseek结合ftell获取文件大小得到两种不同结果?
问题解答
首先要明确:这个额外的8字节并不是文件中实际存在的内容,而是你调用fseek时的偏移操作导致的计算结果。
- 当你执行
fseek(file_ptr, 0, SEEK_END)时,文件指针被定位到文件的实际末尾位置,此时ftell返回的480000就是文件的真实大小。 - 而
fseek(file_ptr, sizeof(double), SEEK_END)的作用是:把文件指针从文件末尾的位置再往后偏移sizeof(double)(也就是8字节),此时ftell返回的数值自然是原文件大小加上这个偏移量,也就是480000+8=480008。
这里的关键是理解fseek第三个参数为SEEK_END时的含义:它是以文件末尾作为偏移的起始点,正数偏移就是往文件末尾的后方移动指针,哪怕这个位置已经超出了文件实际的内容范围。这种情况下,指针指向的是一个不存在的“虚拟位置”,并不代表文件真的有这么多字节。
如果你的意图是定位到最后一个double数据的起始位置,正确的写法应该是:
fseek(file_ptr, -sizeof(double), SEEK_END);
这样才是从文件末尾往前偏移8字节,指向最后一个double的起始地址。
内容的提问来源于stack exchange,提问作者DrBwts
相关产品推荐
相关产品推荐

