从矢量中获取选定数据,然后存储为变量

时间:2013-04-09 13:22:39

标签: c++ variables vector integer double

我目前将所有数据存储到矢量中作为变量。我试图从该向量中获取选定的数据,然后将其存储为变量,以便我可以进行计算,将答案保存为变量,然后存储回原始向量中?

数据文件采用以下格式;

    a     b       c        d      e
    1    7.3     0.8      14    74.6     
    2    6.5     0.1      13     3.3     
    3   10.8     1.4      12    75.8     
    4   13.2     3.5       6    32.4

到目前为止我的代码如下;

struct Weather
{
  int a_data;
  double b_data;
  double c_data;
  int d_data;
  double e_data;
  double ans_data;
};



int main () 
{
  using std::vector;
  using std::string;
  using std::getline;
  using std::cout;

  vector<Weather> data_weather;
  string line;
  ifstream myfile ("weatherdata.txt");

  if (myfile.is_open())
  {
    int count = 0;
    while (getline(myfile, line)) 
    {
      if (count > 6) 
      {
            int a, d; 
            double b, c, e;
            std::istringstream buffer(line); 
            std::string sun_as_string;
            if (buffer >> a >> b >> c >> d >>e_as_string) 
            {
                if (e_as_string == "---")
                {
                    e = 0.0;
                }
                else
                {
                    std::istringstream buffer2(e_as_string);
                    if (!(buffer2 >> e))
                    {
                        e = 0.0;
                    }
                }
                Weather objName = {a, b, c, d, e};
                data_weather.push_back(objName);  
            }
      }
      count++;
    }
    myfile.close();

    double temp_b, temp_c, temp_ans; //declaring my new variables
    for (auto it = data_weather.begin(); it != data_weather.end(); ++it)
    { 
        std::cout << it->b_data << " " << it->c_data << std::endl;

    }
 }

   }
   else 

   cout << "unable to open file";

   scat::pause("\nPress <ENTER> to end the program.");

   return 0;
}

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:0)

我错过了一些明显的东西,或者您只是需要这样做?

for (auto it = data_weather.begin(); it != data_weather.end(); ++it)
{ 
    it->ans_data = it->b_data * it->c_data;
}

取消引用迭代器可以引用向量中的现有对象。你真的不需要临时变量。

更好的C ++ 11替代方案是基于循环的范围:

for (Weather& w : data_weather)
{
    w.ans_data = w.b_data * w.c_data;
}

给出你想要使用的行索引列表,你可以这样做:

Weather& w = data_weather[i]; // shortcut so you don't need to
                              // write data_waether[i] each time
w.ans_data = (w.b_data * w.c_data)/2;

其中i是您感兴趣的行的索引。您可能希望将此作为某种循环。我把它作为练习留给你:)

答案 1 :(得分:0)

我的结构会有所不同。我将用于读取数据的代码编写为operator>>结构的Weather

std::istream &operator>>(std::istream &is, Weather &w) { 
    std::string line;
    std::getline(is, line);
    std::istringstream buffer(line); 

    buffer >> w.a >> w.b >> w.c >> w.d;
    if (!buffer >> w.e) // conversion will fail for "---" or not-present
        w.e = 0.0;
    return is;
}

这可以简化数据读取:

std::ifstream myfile("Weather.txt");

std::string ign;
std::getline(myfile, ign);   // skip that pesky first line

// Now we can initialize the vector directly from the data in the file:
std::vector<Weather> weather_data((std::istream_iterator<Weather>(myfile)),
                                  std::istream_iterator<Weather>());

使用合理的最新编译器,也可以简化打印数据:

for (auto &w : weather_data)
    std::cout << w.b_data << " " << w.c_data << "\n";

如果您想进行计算,并将结果放回到结构的ans字段中,那也很容易。例如,我们假设bcd是温度,我们希望ans包含三者的平均值:

for (auto &w : weather_data)
     w.ans = (w.b_data + w.c_data + w.d_data)/3.0;