2 функции, которые должны быть одинаковыми, дают разные результаты - PullRequest
0 голосов
/ 28 мая 2020

Я читаю файл в вектор, чтобы прочитать из него байты. Автономная функция работает нормально, но я не хочу открывать и закрывать файл и создавать вектор каждый раз, когда я обращаюсь к нему, поскольку я собираюсь захватить много байтов. Поэтому я решил поместить его в файловый класс. Однако это привело к тому, что при использовании класса файла я получил совершенно другие результаты.

Это рабочая автономная функция:

template<class T>
T readFromNewFile(std::string path, size_t size = 0, uint offset = 0)
{
    std::ifstream in(path.c_str(), std::ios::binary | std::ios::ate);
    if (in.is_open())
    {
        std::streamoff max = in.tellg();
        size_t _size = size == 0 ? (size_t)max : size;
        in.seekg(offset, std::ios::beg); 
        std::vector<uint> v(_size);
        in.read((char*)v.data(), _size);

        uint temp = 0;
        std::stringstream ss; 
        for (uint it = 0; it < v.size(); it++)
        {
            std::cout << "readFromNewFile: Adding offset: " << offset + it << ", with value: " << v[it] << "\n";
            temp += v[it];
        }
        ss << temp;
        T myVar;
        ss >> myVar;
        return myVar;
    }
    return T();
}

Рассматриваемый класс файла:

class File
{
public:
    File() {}
    File(std::string path)
    {
        LOAD(path);
    }
    ~File() {}
    void LOAD(std::string path)
    {
        std::ifstream in(path.c_str(), std::ios::binary | std::ios::ate);
        if (in.is_open())
        {
            std::streamoff max = in.tellg();
            size_t _size = (size_t)max;
            in.seekg(0, std::ios::beg);
            data.clear();

            data.resize(_size);
            in.read((char*)data.data(), _size);
        }
    }
    template<class T>
    T readFromVector(size_t size = 0, uint offset = 0)
    {
        uint temp = 0;
        std::stringstream ss;
        for (uint it = offset; it < (offset + size) && it < data.size(); it++)
        {
            std::cout << "readFromVector: reading offset: " << it << ", with value: " << data[it] << "\n";
            temp += data[it];
        }
        ss << temp;
        T myVar;
        ss >> myVar;
        return myVar;
    }
private:
    std::vector<uint> data;
};

Весь код вызывается в этом блоке:

bool ArmourManager::init()
{
    std::string armourFile = "resources\\armor.am_dat";
    Offsets::ArmourOffsets offsets;    
    data.LOAD(armourFile); // data is a File object in ArmourManager class
    uint armourOffset = 0x0A;
    uint textOffset = 0x41C06;
    // armours start at offset 0x0A, increase by 0x3C for every armour in file
    // appears to end at 187390 ? 0x2DBFE‬
    //std::cout << "[OFFSET]\t[IDX]\t[RAR]\t[SLOT]\t[DEF]\t[SLOTS]\n";
    while (armourOffset < 0x2DBFE)
    {
        uint ind = SetMaker::readFromNewFile<uint>(armourFile, 4, armourOffset + offsets.Index);
        uint x = data.readFromVector<uint>(4, armourOffset + offsets.Index);
        std::cout << ind << " / " << x << "\n";

Вывод консоли здесь

Из того, что я могу сказать с помощью отладки, вектор данных не не заполняется правильно, он заполняется странными данными.

Проверка первого индекса обоих векторов Даже когда я пробовал что-то вроде этого,

std::vector<uint> x(_size);
in.read((char*)x.data(), _size);
std::cout << "x byte 0: " << x[0] << "\n";

результат все тот же.

...