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