C ++访问冲突写入位置0x00B0A654

时间:2018-03-11 15:17:50

标签: c++ visual-studio ifstream

所以我正在为内置C ++的游戏开发tile引擎。作为其中的一部分,我想从保存在游戏目录中的.txt文件中存储和加载图块。

此代码保存级别

void LevelManager::SaveToFile(char * FileName)
{
    ofstream File(FileName);
    File.clear();
    for (unsigned y = 0; y < 300; y++) {
        for (unsigned x = 0; x < 300; x++) {

            File << TileGrid[x][y].PhysicsNumber << " ";
            File << TileGrid[x][y].GT.TopLeft << " ";
            File << TileGrid[x][y].GT.TopRight << " ";
            File << TileGrid[x][y].GT.BottomLeft << " ";
            File << TileGrid[x][y].GT.BottomRight << " ";
        }
        File <<  "\n";
    }
    File.close();
}

然后以下代码读取文件

void LevelManager::LoadFromFile(char * FileName)
{
    ifstream infile;
    int y = 0;
    int x = 0;
    int counter = 1;
    infile.open(FileName);
    while (y < 300) {
        char Current = 0;
        infile.read(&Current, 1);
        if (Current == 10) {
            y++; 
            x = 0;
        }
        else if (Current == 32) {
            counter++;
            if (counter > 5) counter = 1;
            x++;
        }
        else if (counter == 1) {
            TileGrid[x][y].PhysicsNumber = (TileGrid[x][y].PhysicsNumber * 10) + Current - 48;
        }
        else if (counter == 2) {
                TileGrid[x][y].GT.TopLeft = (TileGrid[x][y].GT.TopLeft * 10) + Current - 48;
        }
        else if (counter == 3) {
            TileGrid[x][y].GT.TopRight = (TileGrid[x][y].GT.TopRight * 10) + Current - 48;
        }
        else if (counter == 4) {
            TileGrid[x][y].GT.BottomLeft = (TileGrid[x][y].GT.BottomLeft * 10) + Current - 48;
        }
        else if (counter == 5) {
            TileGrid[x][y].GT.BottomRight = (TileGrid[x][y].GT.BottomRight * 10) + Current - 48;
        }

    }

    infile.close();
}

Visual Studio给了我这个错误&#34;访问冲突写入位置0x00B0A654&#34;

网上的研究表明,我读的数据并不存在,但我不确定如何解决这个问题。

编辑:忘记提及只在编写保存代码时才会出现错误。

1 个答案:

答案 0 :(得分:0)

与已经说过的其他人一样,如果出现错误,调试器会很有帮助。幸运的是,您已经发现了错误。

尽管如此,我认为您的代码可以简化。过于复杂的代码通常是令人沮丧的错误来源,因此始终是使代码尽可能简单的主要目标。你的LoadFromFile()功能非常复杂;我很难理解那里发生的事情。而且你可能也有...就像你说的那样,错误发生在你的Currentx等声明和if的内部。

以下是LoadFromFile() / SaveToFile()函数的更简单,更易理解的版本。

void LevelManager::SaveToFile( char * FileName ) {
    try {
        std::ofstream file( FileName );
        file.clear();
        for(unsigned y = 0; y < 300; y++) {
            for(unsigned x = 0; x < 300; x++) {
                file << TileGrid[x][y].PhysicsNumber << "\n";
                file << TileGrid[x][y].GT.TopLeft << "\n";
                file << TileGrid[x][y].GT.TopRight << "\n";
                file << TileGrid[x][y].GT.BottomLeft << "\n";
                file << TileGrid[x][y].GT.BottomRight << "\n";
            }
        }
        file.close();
    } catch(...) {} //TODO: catch & evaluate file errors
}

void LevelManager::LoadFromFile( char * FileName ) {
    try {
        std::ifstream file( FileName );
        for(unsigned y = 0; y < 300; y++) {
            for(unsigned x = 0; x < 300; x++) {
                file >> TileGrid[x][y].PhysicsNumber;
                file >> TileGrid[x][y].GT.TopLeft;
                file >> TileGrid[x][y].GT.TopRight;
                file >> TileGrid[x][y].GT.BottomLeft;
                file >> TileGrid[x][y].GT.BottomRight;
            }
        }
        file.close();
    } catch(...) {} //TODO: catch & evaluate file errors
}

这一次,LoadFromFile()更容易理解。您甚至可以通过编写一个操作符来简化这一操作,该操作符将一个完整的TileGrid元素推送到流中/从流中弹出。

我在测试环境中大致测试了这段代码;如果您需要整个文件,请告诉我。