【问题标题】:Can't get fstream to seekg back to 0 after EOF flag set在设置 EOF 标志后无法让 fstream 回溯到 0
【发布时间】:2015-08-26 21:30:45
【问题描述】:

所以我有这个从我的文件中读取的 fstream,并且在设置 EOF 标志后尝试从我的文件中读取时我遇到了这个疯狂的错误(或者至少这是我认为正在发生的事情) .

这是我的问题范围:

if (!reader.good())
        {
            reader.clear();
            reader.seekg(0, ios::beg);
        }
int test = reader.tellg();
reader.seekg((index / 10) * 10 * sizeof(TrieNode));
test = reader.tellg();
reader.read((char*)TrieBuff, 10 * sizeof(TrieNode));
test = reader.tellg();

我添加了整数“测试”,这样我就可以在调试器中跟踪流在每个步骤中的位置。现在我在调试器中看到的是,即使程序进入'if'并清除fstream,测试之后仍然等于-1!然后什么都不会读入 TrieBuff。我不知道在这里做什么。

这是整个函数,以防万一:

// Takes an fstream opened at the doc's trie file. Returns the node at the 
    // index specified, using the TrieBuff. (The index is the node's serial number.)
    TrieNode get_node_at_index(fstream& reader, int index)
    {
        if (TrieBuff[0].data.nodeserialnr == -1 ||
            index > TrieBuff[9].data.nodeserialnr || index < TrieBuff[0].data.nodeserialnr)
        {
            if (!reader.good())
            {
                reader.clear();
                reader.seekg(0, ios::beg);
            }
            int test = reader.tellg();
            reader.seekg((index / 10) * 10 * sizeof(TrieNode));
            test = reader.tellg();
            reader.read((char*)TrieBuff, 10 * sizeof(TrieNode));
            test = reader.tellg();
            int x = 0;
        }
        return TrieBuff[index % 10];
    }

【问题讨论】:

  • 你是用文本模式还是二进制模式打开文件?
  • @ScottSteinbach 请将std::cout &lt;&lt; (reader.is_open() ? "open\n" : "closed\n"); 行添加为get_node_at_index 的第一行,并在您发现int test = reader.tellg(); 设置test == -1 之前告诉我们它打印的内容。跨度>

标签: c++ iostream fstream eof trie


【解决方案1】:

我无法理解(index / 10) * 10 * sizeof(TrieNode) 的用法。它是故意使用的,那么请检查它是否会为index 评估为0,它不能被10 整除。因为index / 10 是一个整数除法。我猜是因为读取指针没有向前移动。

【讨论】:

  • 我确实有目的地使用它,它的目的是我使用十个块与我的 trie 文件进行交互。所以如果我想访问第 5 个节点,我会读取第 0 个块,如果我想要第 42 个节点,我会读取第 4 个块。所以整数除法是有​​意的。但无论函数何时进入 if 语句,当调用 'int test = reader.tellg()' 时,调试器都会显示 test 等于 -1。为什么 'seekg(0, ios::beg)' 不将其重置为 0?
  • @ScottSteinbach 我认为你错过了 kravi 的观点,如果你将我的 10 和做它乘以 10 的值不会改变。此外,由于您不能除以 0,因此您可能会遇到除以零异常的风险。因此,该行的改进版本是: index * sizeof(TrieNode) 它给出与 (index / 10) * 10 * sizeof 相同的值(TrieNode)
  • @Thealon: “如果你把我的东西除以 10 并做它乘以 10,价值不会改变” 那不是真的。你忘记了整数除法。我认为你错过了克拉维的观点。
【解决方案2】:

因此,正如一些人所建议的那样,答案是 fstream 没有正确打开。我没有意识到即使流没有打开,stream.good() 也会返回 true。感谢大家的贡献。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-02-24
    • 2018-09-28
    • 2012-12-18
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    相关资源
    最近更新 更多