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

У меня есть текстовый файл со следующими данными для простой системы входа/выхода:

где каждая строка имеет {time_stamp} {name} {door_entry} {status}

time_stamp — количество секунд, прошедших с произвольного времени начала.

имя – имя пользователя работника.

door_entry — номер двери, в который вы вошли/вышли

статус — вошли ли они в дверь или вышли из нее.

Текстовый файл большой и содержит около 10 000 записей, подобных этому.

Вопрос: мне интересно, как я могу разложить каждую строку и разделить каждую часть информации на переменную. Так, например, у меня есть класс Worker здесь:

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();
        }

Цель этой проблемы, которую я создал, заключается в том, что я просто хочу проверить любую необычную активность в этом текстовом файле, в который 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