void EventListHelper::addFileToList ( const char * file_name ) { std::string line; if(std::string(file_name).find(".gz") != std::string::npos) { std::cout << "INFO: Adding gzipped file " << file_name << " to event list..."; std::ifstream myfile(file_name, std::ios_base::in | std::ios_base::binary); try { boost::iostreams::filtering_istream in; in.push(boost::iostreams::gzip_decompressor()); in.push(myfile); for(std::string str; std::getline(in, str); ) { std::vector<std::string> fields = split ( str, std::string(":") ); if ( fields.size() != 3 ) continue; addEventToList ( atoi ( fields[0].c_str() ), atoi ( fields[1].c_str() ), atoi ( fields[2].c_str() ) ); } } catch(const boost::iostreams::gzip_error& e) { std::cout << "ERROR: problem with event list file " << file_name << " Cowardly exiting." << std::endl; std::cout << e.what() << '\n'; exit(-1); } } else if(std::string(file_name).find(".txt") != std::string::npos) { std::cout << "INFO: Adding txt file " << file_name << " to event list..."; std::ifstream myfile (file_name); if (myfile.is_open()) { while ( myfile.good() ) { getline (myfile,line); std::vector<std::string> fields = split ( line, std::string(":") ); if ( fields.size() != 3 ) continue; addEventToList ( atoi ( fields[0].c_str() ), atoi ( fields[1].c_str() ), atoi ( fields[2].c_str() ) ); } myfile.close(); } else { std::cout << "ERROR: could not open event list file " << file_name << " Cowardly exiting." << std::endl; exit(-1); } } else { std::cout << "ERROR: event list file " << file_name << " does not end with .gz or .txt. We don't know how to handle this. Cowardly exiting." << std::endl; exit(-1); } if(m_set.size() < 1) { std::cout << "ERROR: event list has size < 1. Did something go wrong when reading it? Cowardly exiting." << std::endl; exit(-1); } std::cout << "INFO: added " << m_set.size() << " events." << std::endl; }
void EventListHelper::addFileToList ( const char * file_name, const char * tree_name ) { if(std::string(file_name).find(".root") != std::string::npos) { std::cout << "INFO: Adding root file " << file_name << " containing tree named " << tree_name << " to event list..."; TFile* file = TFile::Open(file_name); if(file->IsOpen()) { TTreeReader reader(tree_name,file); TTreeReaderValue<UInt_t> run(reader,"run"); // aka unsigned int TTreeReaderValue<UInt_t> lumi(reader,"lumi"); // aka unsigned int TTreeReaderValue<ULong64_t> event(reader,"event"); // aka unsigned long long while(reader.Next()) { addEventToList (*run, *lumi, *event); } file->Close(); } else { std::cout << "ERROR: could not open event list file " << file_name << " Cowardly exiting." << std::endl; exit(-1); } } else { std::cout << "ERROR: event list file " << file_name << " does not end with .root. We don't know how to handle this. Cowardly exiting." << std::endl; exit(-1); } if(m_set.size() < 1) { std::cout << "ERROR: event list has size < 1. Did something go wrong when reading it? Cowardly exiting." << std::endl; exit(-1); } std::cout << "INFO: added " << m_set.size() << " events." << std::endl; }
int main( ) { FILE* inFile = fopen( "file.in", "r" ); if ( inFile == NULL ) { printf( "Error opening input file" ); return 1; } int emmissionsNumber; scanDecimal( inFile, &emmissionsNumber ); TVNodeType TVNodeListHead = NULL; int i; //Iterate for each emmission for( i = 0; i < emmissionsNumber; i++ ) { //Create the current emmission EmmissionType *emmission = ( EmmissionType* ) malloc( sizeof( EmmissionType ) ); emmission->title = ( char* ) malloc( MAX_STRING_LENGTH * sizeof( char )); emmission->description = ( char* ) malloc( MAX_STRING_LENGTH * sizeof( char )); emmission->tvProducer = ( char* ) malloc( MAX_STRING_LENGTH * sizeof( char )); //Read emmission details scanDecimal( inFile, &( emmission->idNumber ) ); scanString( inFile, emmission->title ); scanString( inFile, emmission->description ); scanString( inFile, emmission->tvProducer ); scanDateTime( inFile, &( emmission->startTime ) ); scanDateTime( inFile, &( emmission->endTime ) ); int eventsNumber; scanDecimal( inFile, &eventsNumber ); EventType eventListHead = NULL; EventType eventListTail = NULL; //Iterate for each event int j; for ( j = 0; j < eventsNumber; j++ ) { EventType currentEvent = ( EventType ) malloc( sizeof( struct Event ) ); currentEvent->eventTitle = ( char* ) malloc( MAX_STRING_LENGTH * sizeof( char )); currentEvent->organizer = ( char* ) malloc( MAX_STRING_LENGTH * sizeof( char )); currentEvent->eventPlace = ( char* ) malloc( MAX_STRING_LENGTH * sizeof( char )); //Read event details scanString( inFile, currentEvent->eventTitle ); scanString( inFile, currentEvent->organizer ); scanDateTime( inFile, &( currentEvent->dt ) ); scanString( inFile, currentEvent->eventPlace ); scanDecimal( inFile, &( currentEvent->official ) ); //Read sport details SportType *currentSport = ( SportType* ) malloc( sizeof( SportType ) ); currentSport->name = ( char* ) malloc( MAX_STRING_LENGTH * sizeof( char )); currentSport->participant1 = ( char* ) malloc( MAX_STRING_LENGTH * sizeof( char )); currentSport->participant2 = ( char* ) malloc( MAX_STRING_LENGTH * sizeof( char )); scanString( inFile, currentSport->name ); scanDecimal( inFile, &( currentSport->classical ) ); scanDecimal( inFile, &( currentSport->individual ) ); scanString( inFile, currentSport->participant1 ); scanString( inFile, currentSport->participant2 ); //Link the sport with the corresponding event currentEvent->sport = currentSport; addEventToList( &eventListHead, &eventListTail, currentEvent ); } emmission->subjects = eventListHead; TVNodeType currentTVNode = ( TVNodeType ) malloc( sizeof( struct TVNodeStruct ) ); currentTVNode->anEmmission = emmission; addTVNodeToList( &( TVNodeListHead ), currentTVNode ); } TVNodeType resultListHead = NULL; printf( "Enter subject - keyword: "); char answer[ 100 ]; scanf( "%s", answer ); findEmmissionsByKwd( TVNodeListHead, &resultListHead, answer ); printEmmissionsList( resultListHead ); return 0; }