【问题标题】:C++ fseek doesn't set to same positionC++ fseek 没有设置到相同的位置
【发布时间】: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 转换为 char before 与 EOF 相比 - 这可能会导致悲伤,但我不认为它是你的问题。
  • 我做错了什么? -- 我总是怀疑以文本模式打开的文件就像以二进制模式打开一样。
  • @Arzana 你还没有建立一个minimal reproducible example。使用您发布的内容描述您的真实代码正在做什么并不是这样的例子。我们应该能够获取您发布的代码,而无需编辑任何内容,编译并运行代码。

标签: c++ fseek


【解决方案1】:

在将我的问题改进为适当标准的过程中,我发现我正在处理的文件已损坏。也许从移动到不同的操作系统或其他什么? 我将旧文件的内容复制到一个新文件中,它又可以正常工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多