Итак, этот класс PhysFS, который я пишу, кажется, повреждает первые несколько символов всех данных, которые он читает. Остальные данные кажутся нормальными …
Вот код, который вызывается:
std::vector<uint8_t> FileIO::vectorFromFile(std::string fileName)
{
auto buffer = std::make_shared<std::vector<uint8_t> > (*new std::vector<uint8_t>);
if(PHYSFS_exists(fileName.c_str()))
{
PHYSFS_File* filenameHandle = PHYSFS_openRead(fileName.c_str());
if (filenameHandle != 0)
{
bufferSize = PHYSFS_fileLength(filenameHandle);
buffer->resize(bufferSize);
PHYSFS_read (filenameHandle, &buffer->front(), sizeof(uint8_t), bufferSize);
PHYSFS_close(filenameHandle);
}
}
else
{
std::cerr << fileName << " doesn't exist.";
}
buffer->push_back((uint8_t) '\0');
return *buffer;
}
SimpleFile FileIO::getSimpleFile(std::string fileName)
{
SimpleFile file;
std::vector<uint8_t> dataVector = vectorFromFile(fileName);
file.data = &(dataVector[0]);
file.sizeInBytes = dataVector.size();
return file;
}
И этот пример выходы:
─ s 9c rsion="1.0" encoding="UTF-8"?>
<map version="1.0" orientation="orthogonal" width="40" height="40" tilewidth="32
" tileheight="32">
<tileset firstgid="1" name="Desert" tilewidth="32" tileheight
Когда это должно быть:
<?xml version="1.0" encoding="UTF-8"?>
<map version="1.0" orientation="orthogonal" width="40" height="40" tilewidth="32"tileheight="32">
<tileset firstgid="1" name="Desert" tilewidth="32" tileheight
Извините за пастин.
Я немного новичок в чтении файловых систем и PhysFS, так что простите, если я допустил очевидную ошибку.
РЕДАКТИРОВАТЬ:
Заголовок:
#ifndef FILEIO_H
#define FILEIO_H
#include <string>
#include <vector>
struct SimpleFile;
class FileIO
{
private:
int bufferSize = 0;
public:
FileIO();
~FileIO();
std::vector<uint8_t> vectorFromFile(std::string fileName);
SimpleFile getSimpleFile(std::string fileName);
};
struct SimpleFile
{
uint8_t* data;
int sizeInBytes;
};
#endif // FILEIO_H
Я думаю, что ваши данные просто выходят за рамки и используются повторно для чего-то другого:
SimpleFile FileIO::getSimpleFile(std::string fileName)
{
SimpleFile file;
std::vector<uint8_t> dataVector = vectorFromFile(fileName);
file.data = &(dataVector[0]);
file.sizeInBytes = dataVector.size();
return file;
}
Как только функция возвращается dataVector
ушел так file.data
неверный указатель Конечно, я не знаю много о новых возможностях C ++ 11, которые могут это переопределить.
Других решений пока нет …