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

时间:2017-05-09 10:29:24

标签: c fseek

我正在创建一个程序,使用户能够编辑文本文件。其中一个可选方案是“移动”。选择后,程序会要求跳过一些字符,并使用fseek将其跳过文件。

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

我就是这样做的:

  1. 我将文件中的位置保存为pos
  2. 我使用fseek来获取文件中最后一个字符的位置。
  3. 我将此位置与对应于pos之和与用户想要跳过的字符数的位置进行比较。
  4. 结果是true还是false,文件中的位置始终使用pos重置为初始值fseek
  5. 这是我的原始代码:

    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”的内容......

1 个答案:

答案 0 :(得分:3)

您使用fseek()错误,请尝试

fseek(file, pos, SEEK_SET);

总是阅读(文档specification),它会为您节省很多问题。

  

我发现替换参数的顺序并将pos作为偏移量传递,将0作为起始位置使其起作用。但我无法理解为什么以前的代码不起作用

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

此外,您需要小心,您说字符数并且与字节数不同,例如UTF-8字节数字符编码因字符而异。根据{{​​1}}规范,它跳过fseek()个字节,而不是字符。