Provavelmente, existe um grande número de maneiras de fazer isso, mas a mais simples que sempre achei e usei tanto pessoal quanto profissionalmente é criar uma estrutura que contenha todos os valores que desejo salvar.
struct SaveGameData
{
int characterLevel; // Any straight up values from the player
int inventoryCount; // Number of items the player has on them or stored or what not
int[STAT_COUNT] statistics; // This is usually a constant size (I am tracking X number of stats)
// etc
}
struct Item
{
int itemTypeId;
int Durability; // also used as a 'uses' count for potions and the like
int strength; // damage of a weapon, protection of armor, effectiveness of a potion
// etc
}
Depois, escrevo / lemos os dados de e para um arquivo usando os valores básicos de IO do arquivo. O inventárioCont é o número de estruturas de itens que são salvas após a estrutura principal SaveGameData no arquivo, para que eu saiba quantas delas serão lidas após a busca desses dados. A chave aqui é que, quando eu quero salvar algo novo, a menos que seja uma lista de itens ou algo parecido, tudo o que tenho que fazer é adicionar um valor à estrutura em algum lugar. Se for uma lista de itens, terei que adicionar um passe de leitura, como já impliquei para os objetos Item, um contador no cabeçalho principal e depois as entradas.
Isso tem a desvantagem de tornar incompatíveis versões diferentes de um arquivo salvo sem tratamento especial (mesmo que sejam apenas valores padrão para cada entrada na estrutura principal). Mas, no geral, isso facilita a extensão do sistema, apenas adicionando um novo valor de dados e colocando um valor quando necessário.
Novamente, algumas maneiras de fazer isso e isso podem levar mais ao C do que ao C ++, mas ele já fez o trabalho!