Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.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++ 读取文件并将其存储在无序映射中时出现问题_C++_Unordered Map_Istringstream - Fatal编程技术网

C++ 读取文件并将其存储在无序映射中时出现问题

C++ 读取文件并将其存储在无序映射中时出现问题,c++,unordered-map,istringstream,C++,Unordered Map,Istringstream,我正试图读取一个文件并将其内容存储到一个无序的\u映射中,但我遇到了一个小问题。这是我的无序地图: std::unordered_map<std::string, std::vector<double>> _users; 我想在\u users中存储内容,这样键就是名称,在向量中我们有与名称相关的数字。此外,我希望NA等于0。 所以我设法做到了: while ( std::getline(file, line)) { std::istringst

我正试图读取一个文件并将其内容存储到一个
无序的\u映射中
,但我遇到了一个小问题。这是我的
无序地图

std::unordered_map<std::string, std::vector<double>> _users;
我想在
\u users
中存储内容,这样键就是名称,在向量中我们有与名称相关的数字。此外,我希望
NA
等于0。 所以我设法做到了:

while ( std::getline(file, line))
    {
        std::istringstream iss(line);
        std::string key;
        double value;
        iss >> key;
        dict[key] = std::vector<double>();

        while (iss >> value)
        {
            dict[key].push_back(value);
        }
    }
while(std::getline(文件,行)) { 标准::istringstream iss(线); std::字符串键; 双重价值; iss>>键; dict[key]=std::vector(); 而(iss>>值) { dict[key]。推回(值); } }
但是由于
是一个
双精度
,当检查
NA
时,它只会停止while循环,我只会得到,例如Mike:
Mike 4
。如何才能让它读取
NA
,并将其作为向量中的0?谢谢你的帮助

对于内部循环,您可以执行以下操作:

    std::string stringval;
    while (iss >> stringval)
    {
        double value;
        try
        {
            value = std::stod (stringval);
        }
        catch (...)
        {
            value = 0.0;
        }
        dict[key].push_back(value);
    }

我还尝试了一些东西:

#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*[])
{
//1.读取文件并加载地图
std::无序的_映射用户{};
std::ifstream文件{“file.txt”};
std::字符串行{};
while(std::getline(文件,行))
{
标准::istringstream iss(线);
std::字符串键{};
iss>>键;
std::向量值{};
while(国际空间站)
{
双值{0};
如果(iss.str()!=“NA”)
iss>>价值;
值。推回(值);
}
insert({key,values});
}
//2.打印地图
对于(自动常量和[键,值]:用户)
{

std::cout显示的代码已经证明您知道执行此操作所需的一切。与其使用
>
将每个单词提取为
双精度
,不如将其提取为
std::string
,检查是否为“NA”,否则构造一个
std::istringstream
,并使用它提取
>
双值。任务完成。这是否总是一行6列?如果(iss.str()!=“NA”)
测试有缺陷,因为您没有提取像“NA”这样的空格分隔的
std::string
标记与之比较:相反,您是在与整个
std::istringstream
内容进行比较。值得一提的是,这种方法的缺点是,输入中出现的任何其他垃圾都将被悄悄地替换为0。@TonyDelroy是的,您当然可以使其更复杂。我希望保持简单。
    std::string stringval;
    while (iss >> stringval)
    {
        double value;
        try
        {
            value = std::stod (stringval);
        }
        catch (...)
        {
            value = 0.0;
        }
        dict[key].push_back(value);
    }