Я пишу простую текстовую игру в песочнице на с ++ и только что нашел способ сохранить файлы. Посмотрев на несколько вопросов на этом и других сайтах, я решил сделать свои собственные, а не использовать библиотеки повышения и т. Д.
Мой код сохранения работает нормально, но мой код загрузки работает не так, как я хочу!
int loadGame(string filename){
string delim=":";
string readline;
ifstream filestream;
filestream.open(filename.c_str());
while(getline(filestream,readline)){
cout << readline << endl;
stringstream linestream(readline);
string data;
getline(linestream, data, ':');
linestream >> playername >> location[0] >> location[1] >> hitpoints >> coins >> axes >> swords >> food >> maps;
}
return 0;
}
В настоящее время он зацикливается, как и следовало ожидать, но затем сохраняет только последнюю переменную «maps» для имени игрока.
Я понимаю что while(getline(filestream,readline)){
является причиной проблемы, но как новичок я не могу понять, как обойти это без добавления в цикл с большим количеством ifs, который делает
(псевдокод)
while(n<10){
if n=1{ linestream >> playername}
if n=2{linestream >> location[0]...
что мне кажется очень затянутым и неэффективным.
Пример сохранения может выглядеть следующим образом:
playername:John
location[0]:400
location[1]:840
hitpoints:100
coins:35
axes:0
swords:0
food:0
maps:3
Я знаю, что это, вероятно, плохо сформулировано, но я был бы признателен за любую помощь по этой проблеме. Заранее спасибо.
ps любые другие советы по поводу кода, размещенного здесь, было бы здорово 🙂
Если вы начинаете с C ++, я могу дать вам пару советов.
Прежде всего, не беспокойтесь о разборе. Есть гораздо более интересные вещи, связанные с вашим временем. Выберите более простой формат ввода, например,
playername John Doe
hitpoints 300
Обратите внимание, что я использую пробел, чтобы отделить значение от ключа. Теперь вы можете просто сделать что-то вроде:
std::string key, value;
while (<more input>)
{
input_file >> key;
std::getline(input_file, value);
if (key == "playername")
// whatever...
else if (key == "maps")
// stuff...
}
В функции loadGame вы проверяете неизвестное «arg» на строку «null», а не NULL.