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

标签 c++ visual-studio ifstream

<分区>

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

这段代码保存了一个关卡

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 给我这个错误“Access Violation writing Location 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 元素插入流/从流中弹出。

这段代码我在测试环境下粗略测试过;如果您需要整个文件,请告诉我。

关于C++ 访问冲突写入位置 0x00B0A654,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49221558/

相关文章:

c++ - 我正在尝试将过程的结果写入文本文件,我遇到的问题是列的对齐方式

c++ - 从文件中读取行——删除多余的空格

c++ - ifstream 不创建和打开输出文件

c++ - 交叉编译 PCL 时的 CMake 和 HAVE_POSIX_MEMALIGN

c++ - 如何使用 Qt 将颜色应用于 Excel 单元格?

c# - 可绑定(bind)属性不起作用

c# - 逐步的功能测试自动化

c - 自动将 C 源代码翻译成 C89 或 C90

c++ - 为什么文件读取函数中有额外的括号?

c++ - 用于 linux 的最小 c++ make 文件