first of all I am a beginner in coding. Here is a short TEXT RPG I made. This code worked when std::string strPlayerName; were char* strPlayerName[30]; So after I changed this code regarding to std::string, errors occur. I guess file input/output functions are somewhat wrong. Please give me some corrections!
main function is just tons of switches so I didn't write on.
#include <iostream>
#include <fstream>
#include <string>
class Player
{
private:
std::string strPlayerName;
int nSaveNum;
int nDamage;
int nHP;
int nGold;
public:
Player() = default;
Player(std::string pName, int Class, int Damage, int HP, int Gold)
: strPlayerName(pName),nSaveNum(Class), nDamage(Damage), nHP(HP), nGold(Gold)
{
}
Player(const Player& T)
{
strPlayerName = T.strPlayerName;
nSaveNum = T.nSaveNum;
nDamage = T.nDamage;
nHP = T.nHP;
nGold = T.nGold;
}
void setName(std::string pName) { strPlayerName = pName; }
void setSaveNum(int num) { nSaveNum = num; }
void setDamage(int Damage) { nDamage = Damage; }
void setHP(int HP) { nHP = HP; }
void setGold(int Gold) { nGold = Gold; }
void setBattleGold(int Gold) { nGold += Gold; }
void setStoreDamage(int HP) { nHP += HP; }
void setStoreHP(int HP) { nHP += HP; }
void setStoreGold(int Gold) { nGold -= Gold; }
std::string getName() const { return strPlayerName; }
int getSaveNum() const { return nSaveNum; }
int getDamage() const { return nDamage; }
int getHP() const { return nHP; }
int getGold() const { return nGold; }
void addCharacter()
{
std::cout << "NAME : ";
std::cin >> strPlayerName;
std::cout << "NUMBER : ";
std::cin >> nSaveNum;
nDamage = 5;
nHP = 100;
nGold = 0;
}
void showPlayer() const
{
std::cout << strPlayerName << " / " << nSaveNum << " / " << nDamage << " / " << nHP << " / " << nGold << std::endl;
}
};
class Monster
{
private:
std::string strMonsterName;
int nDamage;
int nHP;
int nGold;
public:
Monster(std::string pName, int Damage, int HP, int Gold)
: strMonsterName(pName), nDamage(Damage), nHP(HP), nGold(Gold)
{
}
void setHP(int HP) { nHP = HP; }
std::string getName() const { return strMonsterName; }
int getDamage() const { return nDamage; }
int getHP() const { return nHP; }
int getGold() const { return nGold; }
void showMonster() const
{
std::cout << strMonsterName << " / " << nDamage << " / " << nHP << " / " << nGold << std::endl;
}
};
void newCharacter(Player& player)
{
std::ofstream outFile;
outFile.open("Save.dat", std::ios::binary | std::ios::app);
player.addCharacter();
outFile.write(reinterpret_cast<char*>(&player), sizeof(Player));
outFile.close();
}
Player selectCharacter(int n)
{
Player player, tmp;
std::ifstream inFile;
inFile.open("Save.dat", std::ios::binary);
if (!inFile)
{
throw "File could not be open...";
}
inFile.seekg(0, std::ios::beg);
while (inFile.read(reinterpret_cast<char*>(&player), sizeof(Player)))
{
if (player.getSaveNum() == n)
{
tmp.setName(player.getName());
tmp.setSaveNum(player.getSaveNum());
tmp.setHP(player.getHP());
tmp.setDamage(player.getDamage());
tmp.setGold(player.getGold());
}
}
inFile.close();
std::cout << "Selection Complete" << std::endl;
return tmp;
}
void showAll()
{
Player player;
std::ifstream inFile;
inFile.open("Save.dat", std::ios::binary);
if (!inFile)
{
std::cout << "File could not be open...";
return;
}
std::cout << "CHARACTER LIST" << std::endl;
while (inFile.read(reinterpret_cast<char*>(&player), sizeof(Player)))
{
player.showPlayer();
}
inFile.close();
}
void saveCharacter(Player& p, int n)
{
bool found = false;
Player player;
std::fstream File;
File.open("Save.dat", std::ios::binary | std::ios::in | std::ios::out);
if (!File)
{
std::cout << "File coud not be open...";
}
while (!File.eof() && found == false)
{
File.read(reinterpret_cast<char*>(&player), sizeof(Player));
if (player.getSaveNum() == n)
{
player.setName(p.getName());
player.setSaveNum(p.getSaveNum());
player.setHP(p.getHP());
player.setDamage(p.getDamage());
player.setGold(p.getGold());
int pos = (-1) * static_cast<int>(sizeof(Player));
File.seekp(pos, std::ios::cur);
File.write(reinterpret_cast<char*>(&player), sizeof(Player));
std::cout << "Save Updated";
found = true;
}
}
}
void delete_character(int n)
{
Player player;
std::ifstream inFile;
std::ofstream outFile;
inFile.open("Save.dat", std::ios::binary);
if (!inFile)
{
std::cout << "File could not be open...";
return;
}
outFile.open("Temp.dat", std::ios::binary);
inFile.seekg(0, std::ios::beg);
while (inFile.read(reinterpret_cast<char*>(&player), sizeof(Player)))
{
if (player.getSaveNum() != n)
{
outFile.write(reinterpret_cast<char*>(&player), sizeof(Player));
}
}
inFile.close();
outFile.close();
remove("Save.dat");
rename("Temp.dat", "Save.dat");
std::cout << "Record Deleted" << std::endl;
}