【发布时间】:2018-01-04 11:29:12
【问题描述】:
我需要在某个事件之后返回到我正在阅读的文件中的前一个位置。该文件以文本阅读模式打开。因此,我在读取所需的段之前获得了文件的读取位置,之后我调用 ftell 将我返回到该位置。问题是它没有到我指定的位置,而是向前跳了两个位置。
为了获得当前位置,我使用了这个简化的函数。 我不确定 fflush 是否必要,但它似乎对结果没有影响。
long GetCurPos(void)
{
return ftell(file);
}
打开我正在使用的文件
void Open(void)
{
file = fopen(path, "r");
}
为了返回之前的位置,我使用了这个简化的函数。 它返回一个零值。
void SetPos(long pos) const
{
if (fseek(file, pos, SEEK_SET)) LOG("ferror %d occured!", ferror(file));
}
最后是导致问题的函数
bool TryPeekWord(char * value, size_t maxLen) const
{
bool result = false;
long start = GetCurPos();
int c;
size_t len;
for (len = 0; len < maxLen; len++)
{
c = fgetc(file);
if (c == EOF)
{
*(value + len) = '\0';
result = len > 0;
break;
}
if ((c == ' ' || c == '\n') && len > 0)
{
*(value + len) = '\0';
result = true;
break;
}
*(value + len) = static_cast<char>(c);
}
SetPos(start);
return result;
}
如果我在 SetPos 调用后再次调用 fseek,它的值将与 start 相同,但如果我随后从文件中读取,它将不会返回预期的字符。我做错了什么?
【问题讨论】:
-
你能把这些都写成minimal reproducible example吗?
-
我会尽力的,我不常来见她很抱歉。
-
谢谢!创建示例后,确保它仍然存在问题。据我所见,您的代码很好(除了将结果从
fgetc转换为charbefore 与 EOF 相比 - 这可能会导致悲伤,但我不认为它是你的问题。 -
我做错了什么? -- 我总是怀疑以文本模式打开的文件就像以二进制模式打开一样。
-
@Arzana 你还没有建立一个minimal reproducible example。使用您发布的内容描述您的真实代码正在做什么并不是这样的例子。我们应该能够获取您发布的代码,而无需编辑任何内容,编译并运行代码。