我目前将所有数据存储到矢量中作为变量。我试图从该向量中获取选定的数据,然后将其存储为变量,以便我可以进行计算,将答案保存为变量,然后存储回原始向量中?
数据文件采用以下格式;
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;
}
任何帮助将不胜感激
答案 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
字段中,那也很容易。例如,我们假设b
,c
和d
是温度,我们希望ans
包含三者的平均值:
for (auto &w : weather_data)
w.ans = (w.b_data + w.c_data + w.d_data)/3.0;