1

したがって、私が書いているこの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
4

1 に答える 1

1

あなたのデータは範囲外になり、他の目的で再利用されていると思います。

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の新機能についてはよくわかりません。

于 2012-11-21T00:35:53.957 に答える