【问题标题】:parsing stringstream iterating through content not working解析遍历内容的字符串流不起作用
【发布时间】:2015-06-06 00:13:37
【问题描述】:

我有以下代码从流字符串中检索双精度值,但由于某种原因,我无法遍历流,它只是加载流中的第一个值,然后退出 while,在这两种情况下(i 和 f ) 见下文:

std::string pois_fija_lista = argv[11];
    std::string pois_flotante_lista= argv[12];

    std::vector<double> vector_pois_fija(8), vector_pois_flotante(8);
    std::stringstream ss_fija(pois_fija_lista), ss_flotante(pois_flotante_lista);

    int i=0;
    while (ss_fija >> i || ss_fija.eof())
    {
        vector_pois_fija.push_back(i);

        if (ss_fija.peek() == ';')
            ss_fija.ignore();
    }

    int f=0;
    while (ss_flotante >> f || ss_flotante.eof())
    {
        vector_pois_flotante.push_back(f);

        if (ss_flotante.peek() == ';')
            ss_flotante.ignore();
    }

仅供参考,从 argv 获取的 stringstream 中的值是: -461.3175;-417.031983203125;-523.8393;-417.031983203125;-491.6311;-518.393083203125;-490.6838;-512.709283203125

-102.287501220703;-54.613701647949;-164.809301220703;-54.613701647949;-132.601101220703;-155.974801647949;-131.6194801220016;-131.6594801220016;-4

【问题讨论】:

    标签: c++ parsing stringstream peek


    【解决方案1】:

    您需要提取成双精度而不是整数,否则会设置流故障位。

    您还想在 eof 上终止,而不是继续。无论如何,实际上并不需要 eof 检查,因为将流转换为 bool 无论如何都会在 eof 上给出 false。

    double i = 0.0;
    while (ss_fija >> i)
    {
        vector_pois_fija.push_back(i);
    
        if (ss_fija.peek() == ';')
            ss_fija.ignore();
    }
    

    【讨论】:

    • 是的,当您创建向量时,添加了 8 个默认初始化 (0.0) 值,并且从流中读取的所有值都附加在它们之后。如果你想优化内存分配,你应该调用vector::reserve。
    • 感谢它成功了。我还修改了向量声明并删除了 (8),因为它在分配中造成了一些麻烦。
    猜你喜欢
    • 2016-01-09
    • 2017-01-30
    • 1970-01-01
    • 1970-01-01
    • 2015-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多