决定在最近几个月未能找到合理的ini文件读取方法后,最终咬紧牙关,下载,构建和链接Boost。Boost 1.55.0程序选项问题
在创建一个测试项目以查看过程如何工作之后,我在程序中遇到了一个抛出未知选项异常的选项。下面是测试程序的输出与捕获的错误信息(在一个try/catch正确的错误处理增加)以及ini文件内容,并完整代码一起:
测试INI读... 。
按任意键继续。 。 。
无法识别的选项 'PLAYERDATA.ID'
加载的值:
名称:
ID:8639072
GDIFF:
游戏难度值:
相逢随机性:5.96783e-039
球员伤害修正:1.20858e-038
电脑伤害修正:127232
项目范围最低气温:-2
项目范围高:8623500
按任意键继续。 。 。
的Settings.ini:
[PLAYERDATA]
NAME = Game1A_g
ID = 12231
GDIFF = Medium
#Difficulty Values
[EASY]
ERAND = 0.25f
PDMOD = 2.12f
CDMOD = 0.65f
IRL = 1
IRH = 10
[MEDIUM]
ERAND = 1.00f
PDMOD = 1.00f
CDMOD = 1.00f
IRL = 1
IRH = 25
[HARD]
ERAND = 1.35f
PDMOD = 0.75f
CDMOD = 1.50f
IRL = 1
IRH = 30
代码:
#include <iostream>
#include <Windows.h>
#include <string>
#include <fstream>
#include "boost/program_options.hpp"
using std::cout;
using std::string;
using std::endl;
using std::ifstream;
namespace gOp = boost::program_options;
struct prgVars
{
string name;
int id;
string gDiff;
float encRand;
float pDMod;
float cDMod;
int iRLow;
int iRHigh;
};
void loadGData(prgVars& pgv);
int main()
{
prgVars pgv;
cout << "Testing ini reading...." << endl;
system("Pause");
loadGData(pgv);
cout << "Loaded values:" << endl;
cout << "Name: " << pgv.name << endl;
cout << "ID: " << pgv.id << endl;
cout << "gDiff: " << pgv.gDiff << endl << endl;
cout << "Game Difficulty Values: " << endl;
cout << "Encounter Randomness: " << pgv.encRand << endl;
cout << "Player Damage Modifier: " << pgv.pDMod << endl;
cout << "Computer Damage Modifier: " << pgv.cDMod << endl;
cout << "Item Range Low: " << pgv.iRLow << endl;
cout << "Item Range High: " << pgv.iRHigh << endl;
system("Pause");
}
void loadGData(prgVars& pgv)
{
gOp::options_description desc("Settings");
desc.add_options()
("PLAYERDATA.NAME",gOp::value<string>(&pgv.name),"player_name"),
("PLAYERDATA.ID",gOp::value<int>(&pgv.id),"player_id"),
("PLAYERDATA.GDIFF",gOp::value<string>(&pgv.gDiff),"game_difficulty");
gOp::variables_map vm;
try
{
ifstream settings_file("settings.ini",ifstream::in);
gOp::store(gOp::parse_config_file(settings_file, desc), vm);
settings_file.close();
gOp::notify(vm);
}
catch (const gOp::error& e)
{
std::cerr << e.what() << std::endl;
}
if (pgv.gDiff == "Easy")
{
gOp::options_description desc("DVars");
desc.add_options()
("EASY.ERAND",gOp::value<float>(&pgv.encRand),"encounter_rate"),
("EASY.PDMOD",gOp::value<float>(&pgv.pDMod),"player_damage_bonus"),
("EASY.CDMOD",gOp::value<float>(&pgv.cDMod),"computer_damage_bonus"),
("EASY.IRL",gOp::value<int>(&pgv.iRLow),"item_rng_low"),
("EASY.IRH",gOp::value<int>(&pgv.iRHigh),"item_rng_high");
gOp::variables_map vm;
ifstream settings_file("settings.ini",ifstream::in);
gOp::store(gOp::parse_config_file(settings_file, desc), vm);
settings_file.close();
gOp::notify(vm);
}
else if (pgv.gDiff == "Medium")
{
gOp::options_description desc("DVars");
desc.add_options()
("MEDIUM.ERAND",gOp::value<float>(&pgv.encRand),"encounter_rate"),
("MEDIUM.PDMOD",gOp::value<float>(&pgv.pDMod),"player_damage_bonus"),
("MEDIUM.CDMOD",gOp::value<float>(&pgv.cDMod),"computer_damage_bonus"),
("MEDIUM.IRL",gOp::value<int>(&pgv.iRLow),"item_rng_low"),
("MEDIUM.IRH",gOp::value<int>(&pgv.iRHigh),"item_rng_high");
gOp::variables_map vm;
ifstream settings_file("settings.ini",ifstream::in);
gOp::store(gOp::parse_config_file(settings_file, desc), vm);
settings_file.close();
gOp::notify(vm);
}
else if (pgv.gDiff == "Hard")
{
gOp::options_description desc("DVars");
desc.add_options()
("HARD.ERAND",gOp::value<float>(&pgv.encRand),"encounter_rate"),
("HARD.PDMOD",gOp::value<float>(&pgv.pDMod),"player_damage_bonus"),
("HARD.CDMOD",gOp::value<float>(&pgv.cDMod),"computer_damage_bonus"),
("HARD.IRL",gOp::value<int>(&pgv.iRLow),"item_rng_low"),
("HARD.IRH",gOp::value<int>(&pgv.iRHigh),"item_rng_high");
gOp::variables_map vm;
ifstream settings_file("settings.ini",ifstream::in);
gOp::store(gOp::parse_config_file(settings_file, desc), vm);
settings_file.close();
gOp::notify(vm);
}
}
感谢您的回复,因为它帮助我追踪了除额外逗号以外的主要问题。我没有考虑到每一个ini选项的存在,所以当它通过ini文件时,它窒息了它无法找到的第一个选项。我会在我的回答中更好地解释。 – Geowil
这仍然关闭,因为'parse_config_file'在默认情况下会在它看到一个它不能识别的选项时抛出,这里不需要。你希望所有'parse_config_file(settings_file,desc)'调用都是'parse_config_file(settings_file,desc,true)'。 –