C++ Boost 1.55.0计划选项问题
在过去几个月未能找到合理的ini文件读取方法后,决定最终咬紧牙关,在Boost中下载、构建和链接 在创建了一个测试项目来查看这个过程是如何工作的之后,我被这个程序卡住了,它在其中一个选项上抛出了一个未知的选项异常。以下是测试程序的输出以及捕获的错误消息(添加到try/catch中以正确处理错误),以及ini文件内容和完整代码: 正在测试ini读取 按任意键继续 无法识别的选项“PLAYERDATA.ID” 加载值: 姓名: 身份证号码:8639072 gDiff: 游戏难度值: 遭遇随机性:5.96783e-039 玩家伤害修正值:1.20858e-038 电脑伤害修正:127232 项目范围低:-2 项目范围高:8623500 按任意键继续 settings.ini:C++ Boost 1.55.0计划选项问题,c++,exception,boost,boost-program-options,C++,Exception,Boost,Boost Program Options,在过去几个月未能找到合理的ini文件读取方法后,决定最终咬紧牙关,在Boost中下载、构建和链接 在创建了一个测试项目来查看这个过程是如何工作的之后,我被这个程序卡住了,它在其中一个选项上抛出了一个未知的选项异常。以下是测试程序的输出以及捕获的错误消息(添加到try/catch中以正确处理错误),以及ini文件内容和完整代码: 正在测试ini读取 按任意键继续 无法识别的选项“PLAYERDATA.ID” 加载值: 姓名: 身份证号码:8639072 gDiff: 游戏难度值: 遭遇随机性:5.
[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
代码:
#包括
#包括
#包括
#包括
#包括“boost/program_options.hpp”
使用std::cout;
使用std::string;
使用std::endl;
使用std::ifstream;
名称空间gOp=boost::program_options;
结构prgVars
{
字符串名;
int-id;
字符串gDiff;
浮标镶嵌;
浮动pDMod;
浮动cDMod;
内特伊洛;
国际高;
};
无效载荷数据(prgVars和pgv);
int main()
{
prgVars pgv;
不能逗号太多:
desc.add_options()
("PLAYERDATA.NAME" , gOp::value<string>(&pgv.name) , "player_name") /*HERE*/
("PLAYERDATA.ID" , gOp::value<int>(&pgv.id) , "player_id") /*HERE*/
("PLAYERDATA.GDIFF", gOp::value<string>(&pgv.gDiff), "game_difficulty");
请注意,您可能还需要查看Boost PropertyTree来解析INI文件
因此,在sehe的帖子和T.C.的评论的帮助下,我设法解决了这个问题。虽然添加逗号是一个问题,但主要问题是我没有真正理解解析器是如何读取文件的。它一次读取整个文件,而不仅仅是基于add_o的第一个参数中给出的对标识符的特定部分选项()
因此,我为ini中的每个值创建了一个元素,即使我最终不会使用它,并更新了第一个选项列表,如下所示:
gOp::options_description desc("Settings");
desc.add_options()
("PLAYERDATA.NAME",gOp::value<string>(&cName),"player_name")
("PLAYERDATA.ID",gOp::value<int>(&pgv.id),"player_id")
("PLAYERDATA.GDIFF",gOp::value<string>(&pgv.gDiff),"game_difficulty")
("EASY.ERAND",gOp::value<float>(&pgv.encRand_e),"encounter_rate")
("EASY.PDMOD",gOp::value<float>(&pgv.pDMod_e),"player_damage_bonus")
("EASY.CDMOD",gOp::value<float>(&pgv.cDMod_e),"computer_damage_bonus")
("EASY.IRL",gOp::value<int>(&pgv.iRLow_e),"item_rng_low")
("EASY.IRH",gOp::value<int>(&pgv.iRHigh_e),"item_rng_high")
("MEDIUM.ERAND",gOp::value<float>(&pgv.encRand_m),"encounter_rate")
("MEDIUM.PDMOD",gOp::value<float>(&pgv.pDMod_m),"player_damage_bonus")
("MEDIUM.CDMOD",gOp::value<float>(&pgv.cDMod_m),"computer_damage_bonus")
("MEDIUM.IRL",gOp::value<int>(&pgv.iRLow_m),"item_rng_low")
("MEDIUM.IRH",gOp::value<int>(&pgv.iRHigh_m),"item_rng_high")
("HARD.ERAND",gOp::value<float>(&pgv.encRand_h),"encounter_rate")
("HARD.PDMOD",gOp::value<float>(&pgv.pDMod_h),"player_damage_bonus")
("HARD.CDMOD",gOp::value<float>(&pgv.cDMod_h),"computer_damage_bonus")
("HARD.IRL",gOp::value<int>(&pgv.iRLow_h),"item_rng_low")
("HARD.IRH",gOp::value<int>(&pgv.iRHigh_h),"item_rng_high");
gOp::选项描述描述(“设置”);
说明添加选项()
(“PLAYERDATA.NAME”,gOp::value(&cName),“player\u NAME”)
(“PLAYERDATA.ID”,gOp::value(&pgv.ID),“player\u ID”)
(“PLAYERDATA.GDIFF”,gOp::value(&pgv.GDIFF),“游戏难度”)
(“EASY.ERAND”,gOp::value(&pgv.encRand_e),“遭遇率”)
(“EASY.PDMOD”,gOp::value(&pgv.PDMOD_e),“玩家伤害加成”)
(“EASY.CDMOD”,gOp::value(&pgv.CDMOD_e),“计算机伤害加成”)
(“EASY.IRL”,gOp::value(&pgv.iRLow_e),“item_rng_low”)
(“EASY.IRH”,gOp::value(&pgv.iRHigh_e),“item_rng_high”)
(“中等规模”,gOp::价值(&pgv.encRand_m),“遭遇率”)
(“MEDIUM.PDMOD”,gOp::value(&pgv.PDMOD_m),“玩家伤害加成”)
(“MEDIUM.CDMOD”,gOp::value(&pgv.CDMOD_m),“computer\u damage\u bonus”)
(“MEDIUM.IRL”,gOp::value(&pgv.iRLow_m),“item_rng_low”)
(“MEDIUM.IRH”,gOp::value(&pgv.iRHigh_m),“item_rng_high”)
(“HARD.ERAND”,gOp::value(&pgv.encRand_h),“遭遇率”)
(“HARD.PDMOD”,gOp::value(&pgv.PDMOD_h),“玩家伤害加成”)
(“HARD.CDMOD”,gOp::value(&pgv.CDMOD_h),“computer_damage_bonus”)
(“HARD.IRL”,gOp::value(&pgv.iRLow_h),“item_rng_low”)
(“HARD.IRH”,gOp::value(&pgv.iRHigh)和“item_rng_high”);
然后在try/catch之后从函数中删除所有其他代码。现在,它在main中用于在每个困难之间进行分支,然后计算相关变量的值
输出现在正确显示:
正在测试ini读取
按任意键继续
游戏1a_g
加载值:
名称:Game1A_g
身份证号码:12231
gDiff:中等
游戏难度值:
遭遇随机性:1
玩家伤害修正值:1
电脑伤害修正:1
项目范围低:1
项目范围高:25
按任意键继续
因此,总而言之,在第一个这样的列表中,您必须将每个ini选项包含在add_options()列表中,否则您将遇到与我在程序抛出未知选项错误、未从文件中获取数据或使用parse_config_文件的bool参数时遇到的问题相同的问题(使用true忽略未知选项).感谢您的回复,因为它帮助我找到了除多余逗号以外的主要问题。我没有考虑到存在的每个ini选项,因此在查看ini文件时,它遇到了无法找到的第一个选项。我将在回答中更好地解释。这仍然是错误的,因为解析配置文件
是defau抛出的lt当它看到一个不可识别的选项时,您不希望看到它。您希望所有的parse\u config\u文件(settings\u file,desc)
调用都是parse\u config\u文件(settings\u file,desc,true)
。
Testing ini reading....
unrecognised option 'EASY.ERAND'
Loaded values:
Name:
ID: 4240909
gDiff:
Game Difficulty Values:
Encounter Randomness: 5.94265e-39
Player Damage Modifier: 0
Computer Damage Modifier: 0
Item Range Low: 0
Item Range High: 4215760
gOp::options_description desc("Settings");
desc.add_options()
("PLAYERDATA.NAME",gOp::value<string>(&cName),"player_name")
("PLAYERDATA.ID",gOp::value<int>(&pgv.id),"player_id")
("PLAYERDATA.GDIFF",gOp::value<string>(&pgv.gDiff),"game_difficulty")
("EASY.ERAND",gOp::value<float>(&pgv.encRand_e),"encounter_rate")
("EASY.PDMOD",gOp::value<float>(&pgv.pDMod_e),"player_damage_bonus")
("EASY.CDMOD",gOp::value<float>(&pgv.cDMod_e),"computer_damage_bonus")
("EASY.IRL",gOp::value<int>(&pgv.iRLow_e),"item_rng_low")
("EASY.IRH",gOp::value<int>(&pgv.iRHigh_e),"item_rng_high")
("MEDIUM.ERAND",gOp::value<float>(&pgv.encRand_m),"encounter_rate")
("MEDIUM.PDMOD",gOp::value<float>(&pgv.pDMod_m),"player_damage_bonus")
("MEDIUM.CDMOD",gOp::value<float>(&pgv.cDMod_m),"computer_damage_bonus")
("MEDIUM.IRL",gOp::value<int>(&pgv.iRLow_m),"item_rng_low")
("MEDIUM.IRH",gOp::value<int>(&pgv.iRHigh_m),"item_rng_high")
("HARD.ERAND",gOp::value<float>(&pgv.encRand_h),"encounter_rate")
("HARD.PDMOD",gOp::value<float>(&pgv.pDMod_h),"player_damage_bonus")
("HARD.CDMOD",gOp::value<float>(&pgv.cDMod_h),"computer_damage_bonus")
("HARD.IRL",gOp::value<int>(&pgv.iRLow_h),"item_rng_low")
("HARD.IRH",gOp::value<int>(&pgv.iRHigh_h),"item_rng_high");