Re: [ROOT] Header in ascii file

From: Christian Holm Christensen (cholm@hehi03.nbi.dk)
Date: Thu Oct 16 2003 - 17:14:01 MEST


Hi,

"Axel Naumann" <axel-naumann@gmx.de> wrote concerning
  Re: [ROOT] Header in ascii file [Thu, 16 Oct 2003 15:05:34 +0200 (CEST)] 
----------------------------------------------------------------------
> Hi,
> 
> now that's simple. The easiest way (using an excerpt from staff.C as an
> example):
> 
>     int line=0;
>     while (fgets(&line,80,fp)) {
>        sscanf(&line[0],"%d %d %d %d
> %d",&staff.Category,&staff.Flag,&staff.Age,&staff.Service,&staff.Children);
>        sscanf(&line[32],"%d %d  %d %d %s
> %s",&staff.Grade,&staff.Step,&staff.Hrweek,&staff.Cost,staff.Division,staff.Nation);
>        if (line++)>6) tree->Fill();
>     }
> 

Why not use proper C++ constructs? 

  #ifndef __CINT__
  #ifndef __IOSTREAM__
  #include <iostream>
  #endif
  #ifndef ROOT_TTree
  #include "TTree.h"
  #endif
  #endif
  #ifndef __STRING__
  #include <string>
  #endif
  #ifndef __FSTREAM__
  #include <fstream>
  #endif
  
  using namespace std;
  
  struct person { 
    int    category; 
    int    flag;
    int    age;
    int    service;
    int    children;
    int    grade;
    int    step;
    int    hours_per_week;                              
    int    cost;
    char   division[4];
    char   nationality[3];
  };
  
  
  istream& operator>>(istream& in, person& p) 
  {
    return in >> p.category
              >> p.flag
              >> p.age
              >> p.service
              >> p.children
              >> p.grade
              >> p.step
              >> p.hours_per_week
              >> p.cost
              >> p.division
              >> p.nationality;
  }
  TTree* read(const string& filename, size_t skip=6) 
  {
    TTree*   tree;
    ifstream input(filename.c_str());
    if (!input) { 
      cerr << "bad file" << endl;
      return 0;
    }
    
    
    for (size_t i = 0; i < skip; i++) { 
      string line; 
      getline(input, string);
    }
    
    person p;
    tree = new TTree("T", filename.c_str());
    tree->Branch("staff",&p.category,
                 "Category/I:Flag:Age:Service:Children:"
                 "Grade:Step:Hrweek:Cost");
    tree->Branch("Division",p.division,"Division/C", 32000);
    tree->Branch("Nation",p.nationality,"Nation/C", 32000);
    
    while (true) {      
      input >> p;
      
      if (input.eof()) break;
      if (input.bad()) { 
        cerr << "bad read" << endl;
        delete tree;
        tree = 0;
      }
      tree->Fill();
    }
    
    input.close();
    return tree;
  }

Much more pedagogical I think.  I really think the examples in ROOT
should avoid C/C-like/Fortran-like constructs (sscanf being the case
at hand), and promote more OO kind of programming. 

Yours,

 ___  |  Christian Holm Christensen 
  |_| |	 -------------------------------------------------------------
    | |	 Address: Sankt Hansgade 23, 1. th.  Phone:  (+45) 35 35 96 91
     _|	          DK-2200 Copenhagen N       Cell:   (+45) 24 61 85 91
    _|	          Denmark                    Office: (+45) 353  25 404
 ____|	 Email:   cholm@nbi.dk               Web:    www.nbi.dk/~cholm
 | |



This archive was generated by hypermail 2b29 : Thu Jan 01 2004 - 17:50:16 MET