c++ 当从我的项目中运行一个函数时,斯托德()函数给出了一个不正确的结果

5kgi1eie  于 2023-04-08  发布在  其他
关注(0)|答案(1)|浏览(109)

我有三个文件-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标准。
我找不到任何答案

crcmnpdw

crcmnpdw1#

您应该使用库函数get<T>()json对象中提取值,而不是自己使用受当前区域设置影响的std::stod
在您的案例中:

double parsed_number = parsedFile["points"]["step"].get<double>();

如果你愿意,你也可以创建一个from_json重载来直接填充对象:

#include <nlohmann/json.hpp>

#include <fstream>
#include <iostream>

using json = nlohmann::json;

json read_json_file() {
    if(std::ifstream jsonFile("json/settings.json"); jsonFile) {
        return json::parse(jsonFile);
    }
    return {};
}

struct points {
    int range;
    double step;
};

void from_json(const json& j, points& p) {
    auto& jpnts = j.at("points");
    jpnts.at("range").get_to(p.range);
    jpnts.at("step").get_to(p.step);
}

int main() {
    auto parsedFile = read_json_file();
    auto pnts = parsedFile.get<points>();

    std::cout << pnts.range << '\n' << pnts.step << '\n';
}

相关问题