std::string fProjNameIn, fProjNameOut;
TTree *tTShowerHeader;
tTShowerHeader = new TTree("tTShowerHeader","Parameters of the Shower");
tTShowerHeader->Branch("fProjName",&fProjNameIn);
tTShowerHeader->Fill();
我正在尝试执行以下操作
fProjNameOut = (std::string) tTShowerHeader->GetBranch("fProjName");
虽然
,但不编译std::cout << tTShowerHeader->GetBranch("fProjName")->GetClassName() << std::endl;
告诉我,此分支的类型为string
是否有一种从根树中读取std :: string的标准方法?
答案 0 :(得分:2)
您正在调用tTShowerHeader->GetBranch("fProjName")
- &gt; 并进行编译。这意味着tTShowerHeader->GetBranch()
的返回类型是指针。
此外,您在该指针上调用GetClassName()
并进行编译,因此它是指向类类型的指针。
更重要的是,std::string
不有GetClassName()
方法,因此 <{1}}。确实,seems it is TBranch *
。您必须find appropriate method that will give you the text。
PS:忘了在C ++中使用C风格的强制转换。 C风格的演员是邪恶,因为根据类型的不同,它会做不同的事情。使用受限制的std::string*
,static_cast
,dynamic_cast
或函数式转换(如果您确实需要,则使用const_cast
,但这应该非常罕见)。
答案 1 :(得分:2)
解决方案如下。
想象一下,你有一个ROOT文件,并且想要将std :: string保存到它。
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
要访问它:
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);
要打印到标准输出:
std::cout << some_str_pt->c_str() << std::endl;
希望这有帮助。
答案 2 :(得分: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"
在root中,TTree类将地址存储到用于输入的varriable中。使用GetEntry()将使用存储在TTree中的信息填充相同的变量。 您还可以使用tTShowerHeader-&gt; Print()来显示每个分支的entires数。