我正在创建一个程序,使用户能够编辑文本文件。其中一个可选方案是“移动”。选择后,程序会要求跳过一些字符,并使用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”的内容......
答案 0 :(得分:3)
您使用fseek()
错误,请尝试
fseek(file, pos, SEEK_SET);
总是阅读(文档或specification),它会为您节省很多问题。
我发现替换参数的顺序并将pos作为偏移量传递,将0作为起始位置使其起作用。但我无法理解为什么以前的代码不起作用
嗯,这是因为这是参数的正确顺序,顺便说一下,0
是SEEK_SET
的值。
此外,您需要小心,您说字符数并且与字节数不同,例如UTF-8字节数字符编码因字符而异。根据{{1}}规范,它跳过fseek()
个字节,而不是字符。