我正在尝试从包含来自某些列的数据的数据文件创建对象,仅当质量(第一列)保持不变时。这是我现在的尝试 -
void read_mass() {
vector<double> value(29);
double _value ;
double _mass ;
double _next_mass ;
_file >> _mass ;
WimpData* mDM = new WimpData(_mass) ;
_next_mass = _mass ;
cout << "Reading data for mass " << _mass << endl;
do {
for (int i=0 ; i < 29 ; i++) {
_file >> _value ;
value[i]=_value;
cout << value[i] << " ";
}
mDM->add_line(value[0] ,value[23],value[24],value[25]);
if (_file.eof()) break ;
_file >> _next_mass ;
} while (_next_mass == _mass) ;
_wimp.insert(pair<double, WimpData*>(_mass, mDM));
cout << "Finished reading data for mass " << _mass << endl ;
}
我第一次使用此功能时,它可以正常工作。在第二个调用中,我看到该文件的指针没有停留在质量具有新值的位置,但步骤只有一步。
如何才能使文件的指针在do-while循环中继续计数?
答案 0 :(得分:2)
问题是因为你重写了_next_mass并且在下一次执行中你开始从读取第一个值到_mass(你之前在执行中重写它)。
例如,你可以用它来读取它并将最后一个readed质量保存在私有变量中。并添加任何函数init(),它将读取初始质量。
快速解决方案:
double _mass = -1.0; //initial mass firstly not read (-1)
void read_mass() {
vector<double> value(29);
double _value ;
double _next_mass ;
if(_mass == -1)
_file >> _mass ;
WimpData* mDM = new WimpData(_mass) ;
_next_mass = _mass ;
cout << "Reading data for mass " << _mass << endl;
do {
for (int i=0 ; i < 29 ; i++) {
_file >> _value ;
value[i]=_value;
cout << value[i] << " ";
}
mDM->add_line(value[0] ,value[23],value[24],value[25]);
if (_file.eof()) break ;
_file >> _next_mass ;
} while (_next_mass == _mass) ;
_wimp.insert(pair<double, WimpData*>(_mass, mDM));
cout << "Finished reading data for mass " << _mass << endl ;
_mass = _next_mass; //we readed the first mass of next line (save it)
}