FSEEK 获取最后一个字符的位置而不是想要的字符

FSEEK gets the position of the last character instead of the wanted one

我正在制作一个允许用户编辑文本文件的程序。可用选项之一是 "move"。选择后,程序会要求跳过一些字符,并使用 fseek.

在文件中跳过它们

然而,要做到这一点,我需要确保用户尝试到达的位置与实际角色相对应。为此,我创建了一个函数来检查是否可以跳过。

我是这样做的:

  1. 我把文件中的位置保存为pos.
  2. 我使用fseek获取文件中最后一个字符的位置。
  3. 我把这个位置和pos和用户要跳过的字符数之和对应的位置进行比较
  4. 无论结果是true还是false,文件中的位置总是重置为初始值pos,使用fseek.

这是我的原始代码:

if (pos + nb > ftell(file))
{
    fseek(file, 0, pos);
    return (1);
}
else
{
    fseek(file, 0, pos);
    return (0);
}

使用这段代码,如果初始值pos不为0,fseek不会将位置重置为pos,而是重置为最后一个字符的位置。 (?!) 我发现替换参数的顺序并传递 pos 作为偏移量和 0 作为起始位置使其工作。但是我不明白为什么以前的代码不起作用。

我想要一些帮助以更好地理解函数 fseek 的工作原理,显然,有些细节我没有找到。我在 GNU C 参考手册中没有找到任何关于 "fseek" 的信息...

你用的fseek()错了,试试

fseek(file, pos, SEEK_SET);

经常阅读(文档specification),它会为你省去很多问题。

I found out that replacing the order of the arguments and passing pos as the offset and 0 as the starting position makes it work. But I can't get why the previous code doesn't work

嗯,这是因为这是参数的正确顺序,顺便说一句 0SEEK_SET 的值。

还有,你要小心,你说的字符数字节数是不一样的,因为UTF-8 中字符编码的字节数因字符而异。根据 fseek() 规范,它会跳过 pos 个字节,而不是字符。