【问题标题】:istringstream and reading floatistringstream 和读取浮点数
【发布时间】:2021-06-13 14:11:29
【问题描述】:

this question也提到了这个问题。

我正在使用std::getline逐行读取文件。

     std::getline(points_file, thisline);
     std::istringstream iss(thisline);
     int cnt = 0;
     Coordinates.resize(NumberOfNodes, std::vector<float>(3));
     for(std::istream_iterator<float> iit( iss );
        iit!=std::istream_iterator<float>( );
        iit++ )
     {
        assert( cnt < 3 );
        *(iit) >> Coordinates[i][cnt];
        cnt++;
     }

错误信息: error: invalid operands to binary expression ('const float' and 'std::__1::__vector_base&lt;float, std::__1::allocator&lt;float&gt; &gt;::value_type' (aka 'float')) *(iit) &gt;&gt; Coordinates[i][cnt];

如果我尝试读取整数,这将完美无缺。我正在使用CLANGGCC 似乎不会出现此问题,但是,我无权访问此 atm 进行实际测试。另外,为什么CLANG 会失败,如何解决?

【问题讨论】:

  • 对于整数它可以工作,因为它是按位移位操作。 float 无法移动。 Coordinates[i][cnt] = *iit;

标签: c++ clang istream


【解决方案1】:

使用 push_back 或常规赋值(不是 >>)将值存储在容器中:

for(std::istream_iterator<float> iit(iss), iitEnd; iit != iitEnd; iit++)
{
   assert( cnt < 3 );

   // This means you SHOULDN'T pre-resize()
   Coordinates[i].push_back(*iit);

   //or

   // This means you SHOULD pre-resize()
   Coordinates[i][cnt] = *iit;
   cnt++;
}

另外,考虑使用类似的东西:

using vec3 = std::array<float, 3>;

为了性能和安全,而不是 std::vector&lt;float&gt;(3)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-01
    • 2023-03-13
    • 2021-04-06
    • 1970-01-01
    • 1970-01-01
    • 2015-06-21
    相关资源
    最近更新 更多