Closed. This question needs debugging details。它当前不接受答案。
想改善这个问题吗?更新问题,以便将其作为on-topic用于堆栈溢出。
2年前关闭。
Improve this question
因此,我正在为内置C++游戏开发图块引擎。为此,我想从保存在游戏目录中的.txt文件存储和加载图块。
此代码保存一个级别
然后以下代码读取文件
Visual Studio给我这个错误“访问冲突写入位置0x00B0A654”
在线研究表明,我正在读取不存在的数据,但不确定如何解决。
编辑:忘记提及该错误仅在编写保存代码时发生。
这次,
我已经在测试环境中对该代码进行了粗略的测试;请让我知道您是否需要整个文件。
想改善这个问题吗?更新问题,以便将其作为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()
函数确实很复杂;我很难理解那里发生的事情。而且您可能也有...就像您说的那样,错误发生在Current
,x
等声明和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