Неизмененное значение внутри Vector при использовании файлового потока для вставки данных - PullRequest
0 голосов
/ 28 января 2020

Я получил шаблонный класс, в котором у меня есть функция, которая должна читать содержимое текстового файла и создавать объект, который помещается в собственный реализованный векторный класс. Я могу скомпилировать код, но получаю ошибку, связанную с очень большим числом 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;
}

1 Ответ

0 голосов
/ 28 января 2020

Я не уверен, что у меня есть правильный gr asp контекста, в котором выполняются эти операции, но приходит на ум несколько мыслей, которые могут помочь некоторым:

  1. Ваш for-l oop в функции PushBack начинается с инициализации значения от i до 0, но затем ваш шаг продвижения равен ++i. Это предварительное увеличение будет увеличивать i до значения 1, и только после этого будет выполнено тело for-l oop. Я подозреваю, что это может означать, что вы вообще пропускаете что-либо в индекс 0, и у вас могут возникнуть проблемы позже, когда вы пытаетесь получить доступ к (недопустимому) объекту. Может быть, вам повезло бы изменить этот бит на i++?

  2. Может ли этот шаблонный тип T считываться с одного элемента? Я вижу, у вас есть T input; readFileObj >> input;, но это все, что вам нужно для элемента T, или вам, возможно, нужно прочитать несколько вещей, чтобы создать T, который будет помещен в ваш вектор? Если это так, проблема может быть такой же простой, как смещение вашего входного потока, и я вижу некоторую ошибку о недопустимых объектах, имеющих смысл.

...