запись / чтение строки в TTree (cern root) - PullRequest
2 голосов
/ 10 августа 2011

после сохранения строки в 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 ]

2 голосов
/ 15 ноября 2013

Решение следует ниже.

Представьте, что у вас есть файл 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 голосов
/ 10 августа 2011

Вы звоните tTShowerHeader->GetBranch("fProjName") -> и он компилируется.Это означает, что тип возвращаемого значения tTShowerHeader->GetBranch() является указателем .

Более того, вы вызываете GetClassName() для этого указателя, и он компилируется, поэтому это указатель на тип класса.

Более того, std::string не не имеет метод GetClassName(), поэтому не a std::string*.Действительно, кажется, что TBranch *.Вы должны найти подходящий метод, который даст вам текст .

PS: не учиться использовать приведение в стиле C в C ++.Приведение в стиле C - зло , потому что оно будет делать разные вещи в зависимости от типа.Вместо этого используйте ограниченные static_cast, dynamic_cast, const_cast или приведения в функциональном стиле (и reinterpret_cast, если вам это действительно нужно, но это должно быть крайне редко).

1 голос
/ 10 августа 2011

Хорошо, это заняло некоторое время, но я понял, как получить информацию из дерева. Вы не можете напрямую вернуть информацию, ее можно вернуть только через переменную, в которой она была указана.

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 () для отображения количества вводов для каждой ветви.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...