c/c++语言开发共享fseek和SEEK_END的行为

如果我有一个文本文件,其中以下内容打开为二进制文件

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通常处理此类事物的方式一致。 例如,指向存储器块末尾的指针通常指向该块的最后一个字节的一个。

    这也有一个很好的function,你可以通过调用fseek(SEEK_END)加上ftell ()来获取文件的大小。 无需添加或减少1

    来自fseek()的手册页对这个问题有点模棱两可,但与包含相同问题的man lseek相比:

    如果是SEEK_END,则文件偏移量应设置为文件大小加上偏移量。

    在您的示例中,文件的大小为10,偏移量为-3,因此最终位置为10-3 = 7 。 在偏移7中有一个8

    我认为是因为文件的最后一个字符是'n'''或类似的东西。

      以上就是c/c++开发分享fseek和SEEK_END的行为相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/523082.html

      (0)
      上一篇 2020年12月11日
      下一篇 2020年12月11日

      精彩推荐