【问题标题】:Why should fseek be called with offset of -2 instead an offset of -1 in the program that prints the text file backwards?为什么要在向后打印文本文件的程序中使用偏移量 -2 而不是偏移量 -1 调用 fseek?
【发布时间】:2017-02-28 17:58:23
【问题描述】:

以下 C 程序向后打印一个文本文件:

#include <stdio.h>
#define SEEK_SET 0
#define SEEK_CUR 1
#define SEEK_END 2
int main(int argc, char **argv)
{
    FILE *fp = f
   open(argv[1], "r");
   fseek(fp, -1L, SEEK_END);
   while (ftell(fp)) 
   {
      putchar(fgetc(fp));
       fseek(fp, -2L, SEEK_CUR);
   }

putchar(fgetc(fp));

由于程序应该向后打印文本文件,它应该从末尾读取每个字符,而不跳过任何字符。如果是这样,我认为while循环中的调用应该是

fseek(fp, -1L, SEEK_CUR);

为什么偏移量是-2而不是-1?

提前致谢!

【问题讨论】:

  • fgetc() 将其向前移动 1,因此您必须向后移动 2 才能到达它之前的字符。
  • 因为 -1 的搜索每次都会显示相同的字符。
  • 不保证可移植——文本文件不能随意“寻找”
  • 非常感谢。我还是不明白,当我使用 fgetc 获得一个角色时,我想从我刚刚使用 fgetc 获得的角色向后退 1 位,那么为什么偏移量是 -2? @Hans Passant
  • @Tree 因为您不想回到刚刚获得的角色。你想回到之前的那个。

标签: c file text fseek


【解决方案1】:

当您调用 fgetc 时,偏移量比您预期的多 1 个字符,因此您需要将 2 移回以获取您期望得到的字符。否则你会一直得到相同的字符。

【讨论】:

  • 非常感谢。 fgetc 只有在返回字符后才前进 1 个字符,对吗? @Luis Cabrero
  • 如果 fgetc 不成功,它返回 EOF(文件结束)并设置 errno 来指示错误。所以,是的,只有当返回一个字符时,它才会提前 1 个字符。如果你倒退,这不会发生。
  • 非常感谢。实际上,我仍然不确定:假设我的文本文件包含字符串“abcd”,那么 fgetc 将返回 'd',然后将指示器向右推进 1 个位置,其中没有任何内容。然后它将通过调用 fssek 向后退 2 个位置,因此字符将是 'c'。然后 fgetc 将指示器前进到 'd',然后调用偏移量为 -2 的 feek,所以现在打印字符 'b' 等等......我说的对吗? @Luis Cabrero
  • 第一步:“abcd”,如果偏移量在d,fgetc,会返回'd'。然后偏移量将在 EOF(文件结尾)上。在此之后,如果您使用 -2L 调用 fseek,则将偏移量放在“c”上,再次调用 fgetc,它会返回“c”。这将继续以这种方式执行。请注意,如果您有“abcd”并且偏移量在 d 上,如果您调用两次 fgetc,您将强制程序崩溃,因为您不能在 EOF 上调用 fgetc。我想你明白了。
  • 非常感谢您的友好、清晰和详细的解释,以及您的耐心等待。你真的帮助了我,我真的很感激! @Luis Cabrero
猜你喜欢
  • 2019-04-01
  • 2020-04-13
  • 1970-01-01
  • 2015-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-08
  • 1970-01-01
相关资源
最近更新 更多