Hi Christian, Your logic seems OK. What is the problem? Rene Brun On Wed, 12 Jun 2002, cstrato wrote: > Dear Rooters > > Suppose, I have a table containing first name, last name and comment > fields, > which I would like to store in a TTree, using a class TPerson. > This is straight foreward, however, for certain purposes I need to read > into > memory the complete table first (e.g. in order to sort the table > alphabetically > using a hash table). > For this reason I have to create temporary arrays of TString. > > The macro shown below seems to work until now, however, I am wondering if > I do the initialization of the arrays of TStrings correctly, or if there > is a better way? > The problem is that the names in the table do not have the same length, > especially, the comment field can vary from few characters to more than 1000 > characters. With more than 100,000 records to import, this could cause > hidden > memory problems. > > I know this is not necessarily a question for roottalk, nevertheless, it > would be great if someone could give me an advice. > > Thank you in advance for your help. > > Best regards > Christian > -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- > C.h.r.i.s.t.i.a.n. .S.t.r.a.t.o.w.a > V.i.e.n.n.a. .A.u.s.t.r.i.a > -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- > > //______________________________________________________________________________ > class TPerson: public TNamed { > private: > TString fFirstName; > TString fLastName; > TString fComment; > public : > TPerson(); > TPerson(const char *name,const char *title); > virtual ~TPerson(); > } > > //______________________________________________________________________________ > Int_t XGeneChip::ReadNames(ifstream &input) > { > char nextline[4096]; > Int_t i; > Int_t err = 0; > > // Create local arrays to store data from input > TString *arrFirst = 0; > TString *arrLast = 0; > TString *arrComm = 0; > > // initialize memory for local arrays > Int_t size = 100000; > if (!(arrFirst = new TString[size])) {err = -3;} > if (!(arrLast = new TString[size])) {err = -3;} > if (!(arrComm = new TString[size])) {err = -3;} > > if (err == 0) { > // Initialize local arrays > for (i=0; i<size; i++) { > arrFirst[i] = "NA"; > arrLast[i] = "NA"; > arrComm[i] = "NA"; > }//for_i > > // Read data > TString first, last, comm; > for (i=0; i<size; i++) { > input.getline(nextline, 4096) > if (input.fail()) break; > // read fields > // input >> first >> last >> comm; //does not work!!! > first = strtok(&nextline[0], "\t"); > last = strtok(NULL, "\t"); > comm = strtok(NULL, "\t"); > arrFirst[idx] = first; > arrLast[idx] = last; > arrComm[idx] = comm; > }//for_i > > // Do something with the data in memory > // e.g. sort data alphabetically > > // Init tree > tree = etc; > TPerson *name = 0; > etc > > // Fill tree > for (i=0; i<size; i++) { > idx = index[i]; > name->SetFirst(arrFirst[idx]); > name->SetLast(arrLast[idx]); > name->SetComment(Comm[idx]); > tree->Fill(); > }//for_i > > // Write tree to file > tree->Write("", TObject::kOverwrite); > tree->Delete(""); > tree = 0; > > SafeDelete(name); > }//if > > // Clean up > if (arrFirst) {delete [] arrFirst; arrFirst = 0;} > if (arrLast) {delete [] arrLast; arrLast = 0;} > if (arrComm) {delete [] arrComm; arrComm = 0;} > > return err; > }//ReadNames > > > >
This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:50:56 MET