2011-08-10 16 views
2

TTreeに文字列を保存した後、私はコンパイルされません、次の書き込み/読み出し文字列

fProjNameOut = (std::string) tTShowerHeader->GetBranch("fProjName"); 

をやろうとしている

std::string fProjNameIn, fProjNameOut; 
TTree *tTShowerHeader; 
tTShowerHeader = new TTree("tTShowerHeader","Parameters of the Shower"); 
tTShowerHeader->Branch("fProjName",&fProjNameIn); 
tTShowerHeader->Fill(); 

けれども
std::cout << tTShowerHeader->GetBranch("fProjName")->GetClassName() << std::endl; 

が私に語った、この支店は型であるstring

ルートツリーからstd :: stringを読み取る標準的な方法はありますか?

+0

'tTShowerHeader'の種類は何ですか? –

+0

tTShowerHeaderはTTreeです – IljaBek

+1

-1:私はTTreeが何であるかについては全く考えていませんが、一見するとコンパイルできないのはなぜなのでしょうか。 –

答えて

1

これはしばらく時間がかかりましたが、ツリーから情報を取得する方法を理解しました。あなたは直接、それが唯一のそれはで与えられた変数を介して戻すことができ、情報を返すことができません。

std::string fProjNameIn, fProjNameOut; 
TTree *tTShowerHeader; 

fProjnameIn = "Jones"; 
tTShowerHeader = new TTree("tTShowerHeader","Parameters of the Shower"); 
tTShowerHeader->Branch("fProjName",&fProjNameIn); 
tTShowerHeader->Fill();//at this point the name "Jones" is stored in the Tree 

fProjNameIn = 0;//VERY IMPORTANT TO DO (or so I read) 
tTShowerHeader->GetBranch("fProjName")->GetEntries();//will return the # of entries 
tTShowerHeader->GetBranch("fProjName")->GetEntry(0);//return the first entry 
//At this point fProjNameIn is once again equal to "Jones" 

ルートではTTreeクラスは、それへの入力に使用varriableにアドレスを格納します。 GetEntry()を使用すると、同じ変数がTTreeに格納された情報で満たされます。 また、tTShowerHeader-> Print()を使用して、各ブランチのエンティティ数を表示することもできます。

+1

-1:C++でCスタイルのキャストを提案することは決してありません。たいていの場合、C++での*キャストはお勧めしません。キャストを必要とするC++コードは、普通は間違っているか、少なくともそれ自体の利益のためにはあまりにも賢いです。 –

+0

申し訳ありませんが、ありがとう(私はちょうど質問逐語訳のコードを使用していた)。あなたはC++でどのようにキャストするべきか私に教えてください。 – ac1dicburn

+0

@ ad1dicburn:うまく書かれたC++コードは、暗黙的なものと、実際には一時的なものを作成する要求である「関数形式」のキャストを使用するだけで、キャストなしで行うべきです。 'static_cast'(関連ポインタと参照の場合)、' dynamic_cast'(ポリモーフィッククラスのランタイムチェック)、 'const_cast'(CV修飾解除)、' reinterpret_cast'(無関係なポインタの場合) 。もちろん、悪いインタフェースを回避するためには 'const_cast'が必要なだけで、' reinterpret_cast'はおそらく未定義ビヘイビアを呼び出します。 –

2

tTShowerHeader->GetBranch("fProjName")- >を呼び出してコンパイルします。つまり、返品タイプtTShowerHeader->GetBranch()ポインタです。

さらに、ポインタにGetClassName()を呼び出してコンパイルするので、クラス型へのポインタです。さらに

std::stringないGetClassName()メソッドを持っていないので、ないstd::string*です。確かに、それはseems it is TBranch *です。あなたはfind appropriate method that will give you the textでなければなりません。

PS:C++でCスタイルのキャストを使用することはできません。 C型のキャストは悪いです。なぜなら、何が起こっているのかによって異なることになるからです。 static_castdynamic_castconst_cast、またはファンクションスタイルのキャストを使用してください(本当に必要な場合はreinterpret_castですが、これは非常にまれです)。

+0

私はあなたのポイントを参照してください。代わりに固定サイズの文字列を格納する方法を工夫しました - TTreeはC型オブジェクトしか格納できません。 'fXY =(TH2D *)rootfile-> Get(" XY ");はルートの一般的な手法ですので、ルートクラスではなく標準タイプを正しくキャストしようとしました。 – IljaBek

1

解決策は以下のとおりです。

ROOTファイルがあり、std :: stringを保存するとします。

TTree * some_tree = (TTree*)some_file->Get("a_tree_name"); 
std::string * some_str_pt = new std::string(); 
some_tree->SetBranchAddress("str_branch_name", &some_str_pt); 

some_tree->GetEntry(0); 

を標準出力に出力するには:それにアクセスするには

TTree * a_tree = new TTree("a_tree_name"); 
std::string a_string("blah"); 
a_tree->Branch("str_branch_name", &a_string); // at this point, you've saved "blah" into a branch as an std::string 

std::cout << some_str_pt->c_str() << std::endl; 

は、この情報がお役に立てば幸いです。

関連する問題