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