Hi David, Sorry for this late reply. When you use myObject->Write() , the class of myObject must have a Streamer function implemented. see http://root.cern.ch/root/HowtoWrite.html I have modified your code to be runnable through the script compiler . To use it, simply do in a Root interactive session: .L testlist.C++ write() read() Rene Brun #include "TClonesArray.h" #include "TFile.h" #include "TObjString.h" #include "iostream.h" 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; public: ClassDef(TESTLIST,1) }; ClassImp(TESTLIST) void write() { 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; } 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; } David Bailey (Antares Post Graduate) wrote: > > 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