所以我正在制作一个控制台RPG,在完成保存/加载功能(完美工作)后,我开始制作一个sha-256校验和,因此无法编辑保存文件。我几乎所有的代码,但当我用我的保存功能保存游戏和该保存文件的校验和时,我回去加载它,它总是转到校验和不匹配的语句,当我检查chksum.dat时,哈希每次都是相同的,我真的很难过,这是我的代码:
(还有更多代码,但我认为它无关紧要)
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <string>
#include <stdlib.h>
#include <stdio.h>
#include <cstdlib>
#include <windows.h>
#include <fstream>
#include "sha256.h"
using namespace std;
string userinput = "nul";
string name = "nul";
string currentenchant = "nul";
string checksum1 = "nul";
string checksum2 = "nul";
string checksum3 = "nul";
int namelength=0;
int magnumb=0;
int stonenumb=5;
int glowingstone=0;
int redgem=0;
int raind=0;
int trainswordatk=10;
int trainswordspd=10;
int trainswordlevel=0;
int swordmagicdmg=15;
int equippedmagic=0;
int equippedmagicmax=1;
int savelength=0;
bool trainsword=false;
bool firetrainsword=false;
bool icetrainsword=false;
bool poisontrainsword=false;
bool beginchest=false;
bool swordmagic=false;
bool swordmagicequip=false;
void SaveGame()
{
ofstream data("data.dat");
data << "\n";
data <<name;
data << "\n";
data <<userinput;
data << "\n";
data <<currentenchant;
data << "\n";
data <<magnumb;
data << "\n";
data <<stonenumb;
data << "\n";
data <<glowingstone;
data << "\n";
data <<redgem;
data << "\n";
data <<raind;
data << "\n";
data <<trainswordatk;
data << "\n";
data <<trainswordspd;
data << "\n";
data <<trainswordlevel;
data << "\n";
data <<trainsword;
data << "\n";
data <<firetrainsword;
data << "\n";
data <<icetrainsword;
data << "\n";
data <<poisontrainsword;
data << "\n";
data <<beginchest;
data << "\n";
data <<swordmagic;
data << "\n";
data <<swordmagicdmg;
data << "\n";
data <<swordmagicequip;
data << "\n";
data <<equippedmagicmax;
data << "\n";
data <<equippedmagic;
data << "\n";
data <<namelength;
data << "\n";
ofstream data1("data.dat");
ofstream chksum("chksum.dat");
checksum1 = sha256("data.dat");
chksum << checksum1;
}
void LoadGame()
{
int add = 0;
string line;
ifstream chksum("chksum.dat");
getline(chksum, line) >> checksum2;
ifstream chcsum("data.dat");
checksum3 = sha256("data.dat");
if (checksum3==checksum2)
{
goto goodcheck;
} else if (checksum3!=checksum2) {
cout << "Your current save has been modified from your previous one.\n\n";
cout << "Current: " << checksum3 << "\nPrevious: " << checksum2 << "\n\n";
getch();
exit(0);
} else {
cout << "There has been an error loading your game, please try again.\n\n";
getch();
return;
}
goodcheck:
ifstream data("data.dat");
while(data.is_open()){
if (add==0) getline(data, line) >> name;
if (add==1) getline(data, line) >> userinput;
if (add==2) getline(data, line) >> currentenchant;
if (add==3) getline(data, line) >> magnumb;
if (add==4) getline(data, line) >> stonenumb;
if (add==5) getline(data, line) >> glowingstone;
if (add==6) getline(data, line) >> redgem;
if (add==7) getline(data, line) >> raind;
if (add==8) getline(data, line) >> trainswordatk;
if (add==9) getline(data, line) >> trainswordspd;
if (add==10) getline(data, line) >> trainswordlevel;
if (add==11) getline(data, line) >> trainsword;
if (add==12) getline(data, line) >> firetrainsword;
if (add==13) getline(data, line) >> icetrainsword;
if (add==14) getline(data, line) >> poisontrainsword;
if (add==15) getline(data, line) >> beginchest;
if (add==16) getline(data, line) >> swordmagic;
if (add==17) getline(data, line) >> swordmagicdmg;
if (add==18) getline(data, line) >> swordmagicequip;
if (add==19) getline(data, line) >> equippedmagicmax;
if (add==20) getline(data, line) >> equippedmagic;
if (add==21) getline(data, line) >> namelength;
if (add==22) getline(data, line) >> savelength;
//if (add==23) getline(data, line) >> ; (These are for future use convenience)
//if (add==24) getline(data, line) >> ;
//if (add==25) getline(data, line) >> ;
//if (add==26) getline(data, line) >> ;
//if (add==27) getline(data, line) >> ;
//if (add==28) getline(data, line) >> ;
//if (add==29) getline(data, line) >> ;
//if (add==30) getline(data, line) >> ;
//if (add==31) getline(data, line) >> ;
//if (add==32) getline(data, line) >> ;
if (add==22) data.close();
add++;
}
cout << "Game loaded.\n";
getch();
}
答案 0 :(得分:1)
这一行
getline(chksum, line) >> checksum2;
从文件中读取一行到line
,然后将另一个字符串读入checksum2
。这与您写入校验和文件的方式不符。
在调试器中单步执行,直到找到该行,您会发现line
包含校验和且checksum2
为空。
将其更改为
getline(chksum, checksum2);
注意:您确实应该将一些变量放入局部变量并对其进行适当命名。你现在可以很容易地按照自己的计划进行操作,但是在6个月的时间里,你会发现它更加难以理解,当你的想法不是很新鲜的时候。