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