仅当某些值在c ++中保持不变时才读取某些列

时间:2014-01-04 17:06:06

标签: c++ file-io

我正在尝试从包含来自某些列的数据的数据文件创建对象,仅当质量(第一列)保持不变时。这是我现在的尝试 -

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循环中继续计数?

1 个答案:

答案 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)
}