Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/141.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Boost 1.55.0计划选项问题_C++_Exception_Boost_Boost Program Options - Fatal编程技术网

C++ Boost 1.55.0计划选项问题

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.

在过去几个月未能找到合理的ini文件读取方法后,决定最终咬紧牙关,在Boost中下载、构建和链接

在创建了一个测试项目来查看这个过程是如何工作的之后,我被这个程序卡住了,它在其中一个选项上抛出了一个未知的选项异常。以下是测试程序的输出以及捕获的错误消息(添加到try/catch中以正确处理错误),以及ini文件内容和完整代码:

正在测试ini读取

按任意键继续

无法识别的选项“PLAYERDATA.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
代码:

#包括
#包括
#包括
#包括
#包括“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");