[ROOT] Arrays of strings

From: cstrato (cstrato@EUnet.at)
Date: Wed Jun 12 2002 - 22:31:24 MEST


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