Использование getline для разбора и хранения переменных

Я пишу простую текстовую игру в песочнице на с ++ и только что нашел способ сохранить файлы. Посмотрев на несколько вопросов на этом и других сайтах, я решил сделать свои собственные, а не использовать библиотеки повышения и т. Д.

Мой код сохранения работает нормально, но мой код загрузки работает не так, как я хочу!

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 любые другие советы по поводу кода, размещенного здесь, было бы здорово 🙂

0

Решение

Если вы начинаете с 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...
}
1

Другие решения

В функции loadGame вы проверяете неизвестное «arg» на строку «null», а не NULL.

1

По вопросам рекламы [email protected]