C++ Четене и съхраняване на информация от файл

Имам текстов файл, който съдържа следните данни за проста система за влизане/излизане:

където всеки ред има {time_stamp} {name} {door_entry} {status}

time_stamp - брой секунди след произволен начален час

име - Потребителското име на работниците

door_entry - номер на входна/излезла врата

Статус - дали са влезли или излезли през вратата

Текстовият файл е голям и има около 10 000 записа, подобни на този

Въпрос: Чудя се как мога да разложа всеки ред и да разделя всяка част от информацията на променлива. Така например имам работнически клас тук:

class Worker
{
    std::string staffToken;
    int doorEntry;
    std::string status;
    public:
        Employee();
};

Искам да разреша този проблем и с масив. Знам, че мога да използвам вектор или карта, но искам да разреша това с масив. Създадох масив от указателни обекти за класа Worker.

   typedef Worker * WorkPtr;
        WorkPtr * workers = new WorkPtr[MAX]; //where max is some large constant
        for (int i = 0; i < MAX; ++i)  
        {
        workers[i] = new Worker();
        }

Целта на този проблем, който създадох, е, че просто искам да проверя за някаква необичайна дейност в този текстов файл, където работник е влизал или излизал няколко пъти подред:


person Kaskader    schedule 22.08.2017    source източник
comment
Тук има много съществуващи въпроси относно анализирането на текст в C++. С коя конкретна част имате проблеми? Не сте задали въпрос (направили сте изявление за това, което искате да направите).   -  person Ken White    schedule 22.08.2017
comment
Извън темата: Може да използвате прекалено много указатели тук. Създавате масив от указатели към Worker, след което попълвате масива от указатели с конструирани по подразбиране Workers. Може да получите същите резултати със значително по-малко разходи и ръчно управление на паметта с Worker workers[MAX]; и без for цикъл.   -  person user4581301    schedule 22.08.2017


Отговори (1)


можете да използвате този шаблон, за да разделите низ с определен разделител

template<typename Out>
void split(const std::string &s, char delim, Out result) {
    std::stringstream ss;
    ss.str(s);
    std::string item;
    while (std::getline(ss, item, delim)) {
        *(result++) = item;
    }
}

std::vector<std::string> split(const std::string &s, char delim) {
    std::vector<std::string> elems;
    split(s, delim, std::back_inserter(elems));
    return elems;
}

например:

ifstream fin("your_file");
while(getline(fin,str))
{
    vector<string> res;
    res = split(str, ' ');
    //your process with res
}
person Daniel-Wang    schedule 22.08.2017