1

現在、sfml プラットフォーマーを作成していて、マップ タイルを使用しようとしていますが、マップ クラスを実装した後、未処理の例外が発生します。最初に初期化関数を呼び出し、最後に drawmap を呼び出します。ここにコードがあります..

    void Map::Initialise(const char *filename)
{
     std::ifstream openfile(filename);
    if(openfile.is_open())
    {
        std::string tempLine;
        std::getline(openfile, tempLine);

        tempLine.erase(std::remove (tempLine.begin(), tempLine.end(), ' '), tempLine.end());
        MapX = tempLine.length();

        openfile.seekg(0, std::ios::beg);

        while(!openfile.eof())
        {

            openfile >> MapFile[loadCountX][loadCountY];
            loadCountX++;
            if(loadCountX >= MapX)
            {
                loadCountX = 0;
                loadCountY++;
            }
        }
        MapY = loadCountY;
    }

}

void Map::DrawMap(sf::RenderWindow &Window)
{
    sf::Shape rect = sf::Shape::Rectangle(0, 0, BLOCKSIZE, BLOCKSIZE, sf::Color(255, 255, 255, 255));
    sf::Color rectCol;
    for(int i = 0; i < MapX; i++)
    {
        for(int j = 0; j < MapY; j++)
        {
            if(MapFile[i][j] == 0)
                rectCol = sf::Color(44, 117, 255);
            else if (MapFile[i][j] == 1)
                rectCol = sf::Color(255, 100, 17);

            rect.SetPosition(i * BLOCKSIZE, j * BLOCKSIZE);
            rect.SetColor(rectCol);
            Window.Draw(rect);
        }
    }
4

1 に答える 1

1

あなたのファイルループは悪いです。ループを使用するeofと未定義の動作が発生する可能性があり、一般的にファイルループへのアプローチは不十分です。代わりに、次の構造のループに従います。

fileIn >> data
//while fileIn object is good
while(fileIn) {
    //handle data variable
    fileIn >> data; //re-read data in
}

次の変数を読み取る前にデータを操作および処理したい場合は、その逆を行っています。このため、ファイルは eof に到達しますが、最後にもう一度データを読み取って処理しようとすると、例外がスローされます。

私が上で言ったことを拡張します:

openfile >> MapFile[loadCountX][loadCountY];

//while your input stream is still good
while(openfile)
        {
        //handle your file data
            loadCountX++;
            if(loadCountX >= MapX)
            {
                loadCountX = 0;
                loadCountY++;
            }
        //now read in again AFTER
        openfile >> MapFile[loadCountX][loadCountY];
        }

データを正しく読み込んで保存する必要があります。

于 2013-04-02T20:41:09.580 に答える