0

関数で分析できるように、テキスト ファイルからデータをインポートして変数に割り当てようとしています。データの形式は次のとおりです。

Run 141544 event 5
Njets 0
m1: pt,eta,phi,m= 231.277 0.496237 -2.22082 0.1 dptinv: 0.000370146
m2: pt,eta,phi,m= 222.408 -0.198471 0.942319 0.1 dptinv: 0.00038302

Run 141544 event 7
Njets 1
m1: pt,eta,phi,m= 281.327 -0.489914 1.12498 0.1 dptinv: 0.000406393
m2: pt,eta,phi,m= 238.38 0.128715 -2.07527 0.1 dptinv: 0.000399279

... 約 15000 のエントリがあり、それぞれに 4 つの行があります。各行では、値はスペースで区切られ、各エントリの間には空白行があります。エントリの各行の形式が異なるため、大文字と小文字を区別するループを作成しました。私が抱えている問題は、変数を割り当てるコードに何か問題があるように見えることです。ループを使用して特定のタイプの行を出力すると、すべてが完全に実行されます。しかし、各行を変数に分割し、変数を割り当てて出力しようとすると、プログラムは同じ行を複数回出力してクラッシュします。これが私のコードです:

#include <iostream>
#include <fstream>
#include <sstream>
#include <cmath>
#include <numeric>
#include <vector>
#include <algorithm>
#include <string>
#include <cstring>
#include <iterator>
using namespace std;
using std::cout;
using std::endl;

struct rowtype1 // structure of lines containing run data
{
    string runnumber;
    string eventnumber;
};

struct rowtype2 // structure of lines containing data for muon1 and muon2
{
    string ptvalue1;
    string etavalue1;
    string phivalue1;
    string massvalue1;
};

vector<rowtype1> row1values;
vector<rowtype2> row2values;

int main()
{
    string line;
    ifstream inData;
    inData.open("/Users/Edward/Downloads/muons.txt");

    if (inData.is_open())
    {
        while ( inData.good() )
        {
            while (getline(inData,line))
            {
                if (line[0] == 'N') // recognizes and skips blank lines
                {
                    continue;
                }
                else if (line[1] == 'u') // recognizes lines containing run information
                {
                    istringstream ss(line);
                    istream_iterator<string> begin(ss), end;
                    vector<string> words(begin, end);
                    rowtype1 s { words[1], words[3]};
                    row1values.push_back(s);
                    for(auto && s : row1values)
                        cout << "run " << s.runnumber << " " << "event " << s.eventnumber << "\n";
                }
                else if (line[1] == '1') // recognizes lines containing muon1 information
                {
                    istringstream ss(line);
                    istream_iterator<string> begin(ss), end;
                    vector<string> words(begin, end);
                    rowtype2 s { words[2], words[3], words[4], words[5] };
                    row2values.push_back(s);
                    for(auto && s : row2values)
                        cout << "m1 " << s.ptvalue1 << " " << s.etavalue1 << " " << s.phivalue1 << " " << s.massvalue1 << "\n";
                }
                else if (line[1] == '2') // recognizes lines containing muon2 information
                {
                  istringstream ss(line);
                    istream_iterator<string> begin(ss), end;
                    vector<string> words(begin, end);
                    rowtype2 s { words[2], words[3], words[4], words[5] };
                    row2values.push_back(s);
                    for(auto && s : row2values)
                        cout << "m2 " << s.ptvalue1 << " " << s.etavalue1 << " " << s.phivalue1 << " " << s.massvalue1 << "\n";
                }
            }
        }
        inData.close();
    }
    return 0;
};

変数が正しく割り当てられているかどうかをテストするために、コードに変数の値を出力させました。行をループして変数を出力する代わりに、出力は次のようになります。

run 141544 event 5
Run 141544 event 5
m1 231.277 0.496237 -2.22082 0.1
m2 231.277 0.496237 -2.22082 0.1
m2 222.408 -0.198471 0.942319 0.1
run 141544 event 5
run 141544 event 7
Run 141544 event 7
m1 231.277 0.496237 -2.22082 0.1
m1 222.408 -0.198471 0.942319 0.1
m1 281.327 -0.489914 1.12498 0.1
m2 231.277 0.496237 -2.22082 0.1
m2 222.408 -0.198471 0.942319 0.1
m2 281.327 -0.489914 1.12498 0.1
m2 238.38 0.128715 -2.07527 0.1
run 141544 event 5
run 141544 event 7
run 141572 event 2
4

3 に答える 3

0

すべての行の「タイプ」を区別するために使用if..else if..していますが、各 if ブロックの最後にcontinue. を使用するかif.. continue(好ましいと思います)、またはif .. else if ...

とにかく、あなたのrun x行が重複しているという問題はありますか?線があります

cout << line;

「実行」ケーステストの最後。それはあなたの問題ですか?

于 2013-08-09T20:41:47.887 に答える