2

将字符串保存到 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 的标准方法?

4

3 回答 3

2

您正在调用tTShowerHeader->GetBranch("fProjName")->并且它会编译。这意味着返回类型 oftTShowerHeader->GetBranch()是一个指针

此外,您正在调用GetClassName()该指针并且它可以编译,因此它是指向类类型的指针。

更重要的是,没有方法std::string,所以不是. 确实,它似乎是。你必须找到合适的方法给你文本GetClassName()std::string*TBranch *

PS:忘记在 C++ 中使用 C 风格的转换。C 风格的演员是邪恶的,因为它会根据类型发生不同的事情。请改用受限制static_castdynamic_cast、、const_cast或函数样式的强制转换(reinterpret_cast如果您确实需要,但这应该非常罕见)。

于 2011-08-10T14:11:25.603 回答
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;

希望这可以帮助。

于 2013-11-14T21:20:06.307 回答
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 类将地址存储到用于输入的变量中。使用 GetEntry() 将使用存储在 TTree 中的信息填充相同的变量。您还可以使用 tTShowerHeader->Print() 来显示每个分支的整体数。

于 2011-08-10T15:36:58.937 回答