0

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

数据文件格式如下;

    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;
}

任何帮助,将不胜感激

4

2 回答 2

0

遗漏了一些明显的东西,还是您只需要这样做?

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

取消引用迭代器可为您提供对向量内现有对象的引用。您实际上并不需要临时变量。

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

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 是您感兴趣的行的索引。您可能希望将其设为某种循环。我把它留给你作为练习:)

于 2013-04-09T13:35:44.773 回答
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结构的字段中,那也相当容易。b例如,假设cd是温度,我们想要ans包含三个的平均值:

for (auto &w : weather_data)
     w.ans = (w.b_data + w.c_data + w.d_data)/3.0; 
于 2013-04-09T14:46:55.953 回答