如果我有一个文本文件,其中以下内容打开为二进制文件
1234567890
像这样的电话:
fseek(fp, 5L, SEEK_SET);
当我调用(char)fgetc(fp)
时给我6,因为我从字节0偏移了5个字节(不是从1开始而是从2开始)
但如果我这样做:
fseek(fp, -3L, SEEK_END);
当我打电话给(char)fgetc(fp)
时,给我8而不是7。
为什么?与SEEK_END
一样,偏移量不会从最后一个字节开始。
SEEK_END
从文件的一个过去的最后一个字节进行搜索:
1234567890 <--- bytes from the file
0123456789A <--- SEEK_SET-relative position
A9876543210 <--- SEEK_END-relative position (absolute value)
^
This is the (0, SEEK_END) byte
考虑到这一点,文件的最后一个字节是在(-1, SEEK_END)
找到的那个,因此(-3, SEEK_END)
字节是8
。
请注意,这与C通常处理此类事物的方式一致。例如,指向存储器块末尾的指针通常指向该块的最后一个字节的一个。
这也有一个很好的功能,你可以通过调用fseek(SEEK_END)
和ftell
()来获得文件的大小。无需添加或减少1
!
来自fseek()
的手册页对这个问题有点模棱两可,但与包含相同问题的man lseek
相比:
如果是SEEK_END,则文件偏移量应设置为文件大小加上偏移量。
在您的示例中,文件的大小为10,偏移量为-3,因此最终位置为10-3 = 7
。在偏移7中有一个8
。
我认为是因为文件的最后一个字符是'\n'
或'\0'
或类似的东西。