2011-08-10 3 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'는 아마도 Undefined Behavior를 호출 할 것입니다. –

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_cast, dynamic_cast, const_cast 또는 기능 스타일 캐스트를 제한적으로 사용하십시오 (실제로 필요하다면 reinterpret_cast이지만 매우 드물 것입니다).

+0

당신의 요지를 봅니다. 대신에 고정 된 크기의 char 문자열을 저장하는 방법을 연구했습니다. TTree는 C 유형의 객체 만 저장할 수 있습니다. 'fXY = (TH2D *) rootfile-> Get ("XY");는 루트에서 공통적 인 기술이므로 루트 클래스 대신 표준 타입을 사용하려고 시도했습니다. – IljaBek

1

아래에 솔루션이 나와 있습니다.

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; 

희망을.