Subversion Repositories svnkaklik

Rev

Blame | Last modification | View Log | Download

/*
 * Trida RNDFParser poskytuje metody ke zpracovani textoveho souboru ve
 * formatu RNDF definovaneho v soutezi Rotobour 2007
 *
 * @author:     Vasco
 * @date:       Sat, 21 Jul 2007 15:56:28 +0200
 * @version:    0.0.0
 *
 */
#include <iostream>
#include <string>
#include <map>
#include <vector>
#include <cctype>

#ifdef DBG
  // vypisuje ladici hlaseni
  #include "rndf_dbg.cpp"
#endif

class RNDFParser {
        private:
                std::string rndfname;

        protected:
                /* funkce vezme retezec a rozlozi jej na slova, vraci vector<std::string> */
                std::vector<std::string> toWord(const std::string& veta);

        public:
                RNDFParser(std::string name) { rndfname = name; } // konstruktor, ulozi jmeno souboru
                std::string rndfName() { return rndfname; } // vrati jmeno zpracovavaneho souboru
                std::map<double, double> parseSegment(int numSegment); // rozparsuje zadany segment cesty
                
};

/**
 * @param veta retezec, ktery chceme rozlozit na slova
 *
 * Metoda vezme vstupni retezec a rozlozi jej na slova. Slovo zacina a konci libovolnym poctem
 * bilych znaku, veta konci s koncem retezce. Vysledna slova jsou ukladana do vector<string>,
 * ktery je nasledne vracen volajicimu.
 */
std::vector<std::string> RNDFParser::toWord(const std::string& veta) {
        // definice vlastnich typu
        typedef std::string::size_type vel_vety; // velikost retezce

        // mistni promnene
        std::vector<std::string> slova; // sem se budou ukladat slova
        vel_vety i = 0; // velikost zadane vety

        #ifdef DBG
        // pro kontrolu vypiseme vetu
        echoDbg(veta);
        #endif

        // dokud nedojdeme na konec retezce
        while(i != veta.size()) {
                // jsou na zacatku mezery? preskoc je
                while(i != veta.size() && std::isspace(veta[i])) 
                        i++;

                // uloz pozici zacatku slova
                vel_vety j = i; // pomocny ukazatel v retezci

                // slovo, dokud nenarazime na dalsi mezeru
                while(j != veta.size() && !(std::isspace(veta[j])))
                        j++;

                // pokud se ve vete vyskytovaly slova
                if(i != j) {
                        // vloz slovo do vectoru
                        slova.push_back(veta.substr(i, j - i));

                        // opet ulozime pozici a jdem na dalsi slovo
                        i = j;

                }
        } //end while

        return slova;
}

/* funkce main je jen pro testovaci ucely, prelozi se pouze s definovanym makrem 'DBG' */
#ifdef DBG
int main(void) {
        
        std::cout << "PARSER:\tvypisuji RNDF soubor:" << std::endl;

        RNDFParser parser("RNDF_stromovka.txt");
        std::cout << "PARSER:\tJmeno souboru je " << parser.rndfName() << std::endl;


        return 0;
}
#endif