【问题标题】:Unexpacted value inside Vector when using filestream to insert data使用文件流插入数据时 Vector 内出现意外值
【发布时间】:2020-05-13 08:16:51
【问题描述】:

我有一个模板类,其中我有一个函数,它应该读取文本文件的内容并创建一个对象,该对象被推入一个自己实现的向量类。我可以编译代码,但我收到一个关于向量中第 0 个元素的非常大的数字的错误。 (这是为错误处理提供的脚本生成的错误,不是任何 c++ 编译器错误。)

代码如下所示:

bool FileReading(const std::string &nameOfFile)
{
    std::ifstream readFileObj(nameOfFile);
    if (readFileObj.is_open())
    {
        T input;
        readFileObj >> input;
        PushBack(input);

        readFileObj.close();
        return true;
    }
    return false;
}

变量T input是一个模板变量,函数PushBack是一个将对象推入向量的函数。 (不是 std push_back 函数)

我是否遗漏了一些明显的东西?关于流如何工作的一些基本知识?

这是我的 PushBack 函数:

void PushBack(const T &element)
{
    if (currentElementCount == maximumCapacity)
    {
        T *tempArray = new T[maximumCapacity * 2];
        for (unsigned int i = 0; i < maximumCapacity; ++i)
            tempArray[i] = normalArray[i];
        delete[] normalArray;
        maximumCapacity *= 2;
        normalArray = tempArray;
    }
    normalArray[currentElementCount] = element;
    currentElementCount += 1;
}

【问题讨论】:

  • 听起来问题可能与向量有关,因此您应该展示PushBack 的实现和/或操作向量的代码。
  • 更新了@TheUndeadFish

标签: c++ templates stream stringstream


【解决方案1】:

我不确定我是否正确掌握了执行这些操作的上下文,但我想到了一些可能会有所帮助的想法:

  1. 函数 PushBack 中的 for 循环首先将 i 的值初始化为 0,但随后您的前进步骤是 ++i。这个预增量会将i 的值提高到 1,然后只有在此之后才会执行 for 循环的主体。我怀疑这可能意味着您完全跳过将任何内容放入索引 0 并且稍后当您尝试访问(无效)对象时可能会遇到麻烦。也许你会更幸运地将这个位更改为i++

  2. 这个模板类型 T 是否可以从单个项目中读取?我看到你有T input; readFileObj &gt;&gt; input;,但是你需要一个项目 T 还是你可能需要读一些东西来创建一个将被推入你的向量的 T?如果是这种情况,问题可能就像输入流未对齐一样简单,我可能会看到一些关于无效对象的错误。

【讨论】:

    猜你喜欢
    • 2023-03-17
    • 1970-01-01
    • 2016-06-16
    • 1970-01-01
    • 2021-09-28
    • 1970-01-01
    • 2017-01-15
    • 2020-12-31
    • 1970-01-01
    相关资源
    最近更新 更多