在TTree中写入/读取字符串(cern root)

时间:2011-08-10 12:13:43

标签: c++ string tree root-framework

将字符串保存到TTree后

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的标准方法?

3 个答案:

答案 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_castdynamic_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数。