0

我有一个包含大量数据集的大文件,尽管标记为“--”,但仍有一些空白,无论出于何种原因,数据都没有被记录。其余数据将在向量中以双精度形式存储,我的问题是如何获取丢失的数据并将这些丢失的数据存储为零?我的数据文件的片段;

0    29.1     ---
0    65.9     ---
2    56.5     ---
6    19.7    44.3
9    69.8    64.9
11   118.6   64.8
7    35.7    64.1




if (myfile.is_open())
  {
    int count = 0;
    while ( myfile.good() )
    {
      getline (myfile,line);
      /*if (line == "---")
        {
        sun(0.0);
        }*/
      if (count > 6) 
      {

      std::istringstream buffer(line);
            int month;
            double  rain, sun;
            if (buffer >> month >> rain >> sun)
            {
                Weather objName = {month, rain, sun};
                data_weather.push_back(objName);       
            }
      }
      count++;
    }
    myfile.close();
4

2 回答 2

2

将数据作为字符串一次读取一行。检查它是否是“--”。如果是,则相同的 0.0,如果不是,则转换为双精度并保存双精度。

string line;
while (getline(file, line))
{
    if (line == "--")
    {
        save(0.0);
    }
    else
    {
        istringstrleam buf(line);
        double value;
        if (buf >> value)
        {
            save(value);
        }
        else
        {
            error("could not convert value");
        }
    }
}

我正在使用 istringstream 进行从字符串到双精度的转换。

更新

根据问题中有关文件格式的新信息,以下应该可以工作(但它是未经测试的代码)。

string line;
while (getline(file, line))
{
    if (count > 6)
    {
        int month;
        double rain, sun;
        std::string sun_as_string;
        std::istringstream buffer(line);
        if (buffer >> month >> rain >> sun_as_string)
        {
            if (sun_as_string == "--")
            {
                sun = 0.0;
            }
            else
            {
                std::istringstream buffer2(sun_as_string);
                if (!(buffer2 >> sun))
                {
                    // couldn't convert the sun value, so just set to zero
                    sun = 0.0;
                }
            }
            Weather objName = {month, rain, sun};
            data_weather.push_back(objName);       
        }

    }
    ++count;
}

基本思路和之前一样,将 sun 值读取为字符串,如果不是“--”,则仅将其转换为双精度值。

于 2013-04-08T12:41:30.770 回答
1

我将给出一个稍微不同的替代方案,它不会明确检查该行是否为--,它只是认为它不是有效的float.

您可以简单地使用 一次读出每一行std::getline,这只会在您到达文件末尾时停止。您可以尝试从每一行提取到您已初始化为的float(或) 。如果提取失败,该值仍将为.double00

std::string line;
while (std::getline(file, line)) {
  std::istringstream ss(line);
  float f = 0.0f;
  ss >> f;
  results.push_back(f);
}
于 2013-04-08T12:44:19.063 回答