FSEEK 获取最后一个字符的位置而不是想要的字符
FSEEK gets the position of the last character instead of the wanted one
我正在制作一个允许用户编辑文本文件的程序。可用选项之一是 "move"。选择后,程序会要求跳过一些字符,并使用 fseek
.
在文件中跳过它们
然而,要做到这一点,我需要确保用户尝试到达的位置与实际角色相对应。为此,我创建了一个函数来检查是否可以跳过。
我是这样做的:
- 我把文件中的位置保存为
pos
.
- 我使用
fseek
获取文件中最后一个字符的位置。
- 我把这个位置和
pos
和用户要跳过的字符数之和对应的位置进行比较
- 无论结果是
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
嗯,这是因为这是参数的正确顺序,顺便说一句 0
是 SEEK_SET
的值。
还有,你要小心,你说的字符数和字节数是不一样的,因为UTF-8 中字符编码的字节数因字符而异。根据 fseek()
规范,它会跳过 pos
个字节,而不是字符。
我正在制作一个允许用户编辑文本文件的程序。可用选项之一是 "move"。选择后,程序会要求跳过一些字符,并使用 fseek
.
然而,要做到这一点,我需要确保用户尝试到达的位置与实际角色相对应。为此,我创建了一个函数来检查是否可以跳过。
我是这样做的:
- 我把文件中的位置保存为
pos
. - 我使用
fseek
获取文件中最后一个字符的位置。 - 我把这个位置和
pos
和用户要跳过的字符数之和对应的位置进行比较 - 无论结果是
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
嗯,这是因为这是参数的正确顺序,顺便说一句 0
是 SEEK_SET
的值。
还有,你要小心,你说的字符数和字节数是不一样的,因为UTF-8 中字符编码的字节数因字符而异。根据 fseek()
规范,它会跳过 pos
个字节,而不是字符。