尝试使用fread从文件读取的变量替换现有变量时获取std:bad_alloc

时间:2017-12-28 06:06:00

标签: c++ crash fwrite fread

我遇到了在国际象棋游戏中实现简单的保存/加载功能的问题。保存似乎工作正常,因为它创建一个非空文件(并且不会使游戏崩溃)。然而,装载总是崩溃。在尝试调试它之后,似乎工作正常并加载文件内容(正确地,在检查缓冲区变量之后),但是当尝试用加载的变量替换旧变量时它崩溃了。我正试图用旧转弯和游戏数据(棋盘等)替换当前转弯到旧游戏数据。 一旦它尝试执行更新功能的最后2行,它就会崩溃游戏并给我一个std:bad_alloc崩溃而没有进一步的信息。 游戏本身就是我们需要完成的一个项目,但这个功能根本不需要,我只想尝试看看是否可以实现它:)。任何人都知道如何解决它?

这是我的保存功能:

void MainWindow::saveGame(){
saveData saveGameData;
saveGameData.savedGame = g;
saveGameData.savedTurn = turn;

FILE * pFile;
saveData buffer[] = { saveGameData };
pFile = fopen ("save.bin", "wb");
fwrite (buffer , sizeof(saveData), sizeof(buffer), pFile);
fclose (pFile);
}

这是我的加载功能:

void MainWindow::loadGame(){
saveData* tempSaveData;
game tempGame;
zw tempTurn;

FILE * pFile;
long lSize;
saveData * buffer;
size_t result;

pFile = fopen ( "save.bin" , "rb" );
if (pFile==NULL) {fputs ("File error",stderr); exit (1);}

// obtain file size:
fseek (pFile , 0 , SEEK_END);
lSize = ftell (pFile);
rewind (pFile);

// allocate memory to contain the whole file:
buffer = (saveData*) malloc (sizeof(saveData)*lSize);
if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}

// copy the file into the buffer:
result = fread (buffer,1,lSize,pFile);
if (result != lSize) {fputs ("Reading error",stderr); exit (3);}

// the whole file is now loaded in the memory buffer.

// terminate
fclose (pFile);
free (buffer);

tempSaveData = buffer;
tempGame = tempSaveData->savedGame;

}

这是saveData结构:

struct saveData {
speelbord   savedBord; // speelbord (= chessboard class, in dutch).
zw          savedTurn; // black or white enum. 
};

Speelbord是一个向量<矢量< positie> >

positie是一个类,板上的一块瓷砖被保存为一个位置。

zw是一个以白色和黑色作为选项的枚举。

0 个答案:

没有答案