Hi rooters,
I would like to be able to store a TClonesArray of TStrings ( wrapped in
TObjStrings ). Say I have a class which has a TClonesArray as a private
member. I then add TObjStrings to this array during the lifetime of the
object before writing it to a file. The code below is a simplified example
which runs in ROOT/CINT. I do the following:
root [0]> .L testfile.C
root [1]> main()
test line
Ndata = 3
test one
test two
test three
(Int_t)0
root [2] read()
test line
Ndata = 0
So, the array is built correctly but the data in the array isn't stored in
the file... I'm probably missing something obvious about the ROOT I/O
system. Suggestions? I'm using ROOT 2.25/00 under RH6.1 built from the CVS
source using the linuxegcs option.
---
class TESTLIST : public TObject {
public:
TESTLIST() { fdata = new TClonesArray("TObjString",10); fndata = 0; };
~TESTLIST() { fdata->Delete(); };
void Add(TString l) { new ((*fdata)[fndata++]) TObjString(l); };
TObjString* At(Int_t i) { return (TObjString*)fdata->At(i); };
Int_t ndata() { return fndata; };
private:
TClonesArray *fdata;
Int_t fndata;
};
Int_t main() {
TESTLIST t;
TObjString line("test line");
t.Add("test one");
t.Add("test two");
t.Add("test three");
cout << line->String() << endl;
cout << "Ndata = " << t.ndata() << endl;
for (Int_t i=0; i<t.ndata(); i++) cout << t.At(i).String() << endl;
TFile *f = new TFile("test.root","RECREATE");
f->cd();
t.Write("mylist",TObject::kOverwrite);
line.Write("myline",TObject::kOverwrite);
f->Close();
delete f;
return 0;
}
void read() {
TFile *f = new TFile("test.root","READ");
TObjString *l = (TObjString*)f->Get("myline");
cout << l->String() << endl;
TESTLIST *t = (TESTLIST*)f->Get("mylist");
cout << "Ndata = " << t->ndata() << endl;
for (Int_t i=0; i<t.ndata(); i++) cout << t.At(i).String() << endl;
}
This archive was generated by hypermail 2b29 : Tue Jan 02 2001 - 11:50:29 MET