Closed. This question needs debugging details。它当前不接受答案。












想改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。

2年前关闭。



Improve this question




因此,我正在为内置C++游戏开发图块引擎。为此,我想从保存在游戏目录中的.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给我这个错误“访问冲突写入位置0x00B0A654”

在线研究表明,我正在读取不存在的数据,但不确定如何解决。

编辑:忘记提及该错误仅在编写保存代码时发生。

最佳答案

就像其他人已经说过的那样,调试器在出现错误的情况下是一个很大的帮助。幸运的是,您已经找到了错误。

不过,我认为您的代码可以简化。过于复杂的代码通常是令人沮丧的错误源,因此始终将代码保持尽可能简单始终是一个主要目标。您的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元素推入/弹出到流中。

我已经在测试环境中对该代码进行了粗略的测试;请让我知道您是否需要整个文件。

09-07 09:14