我有三个文件-json文件、我的项目和test(main.cpp)
json文件:
{
"points": {
"range": 25,
"step": 0.001
}
}
在文件main.cpp
中,这段代码:
#include <iostream>
#include <fstream>
#include <string>
#include <nlohmann/json.hpp>
using std::cout;
using std::endl;
using std::string;
using json = nlohmann::json;
int main()
{
std::ifstream jsonFile("json/settings.json");
json parsedFile = json::parse(jsonFile);
jsonFile.close();
double parsed_number;
printf("string: %s\nstod return: %f\n",
parsedFile["points"]["step"].dump().c_str(),
stod(parsedFile["points"]["step"].dump()));
printf("type: %s\n", typeid(stod(parsedFile["points"]["step"].dump())).name());
parsed_number = stod(parsedFile["points"]["step"].dump());
printf("step: %f\n", parsed_number);
std::string temporary = "0.001";
parsed_number = stod(temporary);
printf("temporary: %s \nstep: %f \n", temporary.c_str(), parsed_number);
}
/* outputs:
string: 0.001
stod returns: 0.001000
type: d
step: 0.001000
temporary: 0.001
step: 0.001000
*/
这是正确答案。
但在我的项目中,同样的代码:
std::ifstream jsonFile(json_filename);
assert(jsonFile.is_open());
json parsedFile = json::parse(jsonFile);
jsonFile.close();
//range = stoi(parsedFile["points"]["range"].dump());
double parsed_number;
printf("string: %s\nstod returns: %f\n",
parsedFile["points"]["step"].dump().c_str(),
stod(parsedFile["points"]["step"].dump()));
printf("type: %s\n", typeid(stod(parsedFile["points"]["step"].dump())).name());
parsed_number = stod(parsedFile["points"]["step"].dump());
printf("step: %f\n", parsed_number);
std::string temporary = "0.001";
parsed_number = stod(temporary);
printf("temporary: %s \nstep: %f \n", temporary.c_str(), parsed_number);
/* outputs:
string: 0.001
stod returns: 0,000000
type: d
step: 0,000000
temporary: 0.001
step: 0,000000
*/
也就是说,从我的项目中的字符串"0.001"
中,获得了数字0
,在测试文件中,获得了正确的0.001
。
我试着看看stod(parsedFile["points"]["step"].dump())
返回了什么。我还试着把string
转换成双精度,你可以自己看看结果。
我怎样才能不使用拐杖来解决这个问题呢?
C++20标准。
我找不到任何答案
1条答案
按热度按时间crcmnpdw1#
您应该使用库函数
get<T>()
从json
对象中提取值,而不是自己使用受当前区域设置影响的std::stod
。在您的案例中:
如果你愿意,你也可以创建一个
from_json
重载来直接填充对象: