Вычитание строк времени

Код после чтения файла .dat и создает файл формата .csv, который состоит из множества имен кадров (столбцов) и соответствующих временных интервалов (микросекунд) (строк), хранящихся в строке, разделенной символом «;» :

MFK3_ECAN 1625069169;1625072194;1625072216;1625072229;1625072241;1625072253; MFK3_VIDEO_FrameID 1625334304;1625612508;1625890712;1626168916;1626447120;1626725324;
В чем мне нужна помощь, так это в поиске решения, с помощью которого эти вышеупомянутые две строки «конкретного имени» могут быть вычтены для каждого временного кадра (преобразованы в сек, то есть micsec / 10 ^ 7) с ограничением, что, если есть разница во времени из 3 или более секунд одно состояние должно быть зарегистрировано как «.dat файл поврежден».

Часть кода, читающая файл .dat:

    std::string file_name = m_Filename.toStdString();
size_t found = file_name.find (".dat");
file_name.erase (found, 4);
file_name.insert (found, "_Timestamp_Log");
file_name += ".csv";
m_log.open (file_name.c_str(), std::ofstream::out);
QList<tTimeStamp> tmp_lst;
for (int col = 0; col < m_nStreamCnt; col++)
{
tmp_lst = m_TimestampMap.value(col+1);

m_log << m_StreamIDMap.value(col+1).toStdString() << ";"; //writing Column names

for(int row = 0; row < tmp_lst.size(); row++)
{
m_log << QString::number(tmp_lst.at(row)).toStdString() << ";"; //writing Row values
}

m_log << endl;
}

m_log.close();

1

Решение

Итак, наконец-то я разобрался с решением. Теперь ясно, что я не спрашивал с полной информацией. Но, тем не менее, надеюсь, что решение поможет другим, кто может столкнуться с такой проблемой.
Проблема 1: Мне пришлось искать конкретное имя потока и затем сохранять его с помощью toFloat () для последующего вычитания. Внимание: toInt () или toStdString () будут давать неверные значения.

Проблема 2: QString :: number (tmp_lst [0]) выдаст первое число из строки для вычитания и проверит, что любая разница меньше 3 секунд.

for (int col = 0; col < m_nStreamCnt; col++) //m_nStreamCnt contains function names
{
tmp_lst = m_TimestampMap.value(col+1);

m_log << m_StreamIDMap.value(col+1).toStdString() << ";"; //Column names

if (m_StreamIDMap.value(col+1) == "MFK3_VIDEO_FrameID")
{

m_log << QString::number(tmp_lst[0]).toStdString() << ";";  //Row values
m_current = QString::number(tmp_lst[0]).toFloat();
m_current = m_current/10000000;
}

else if (m_StreamIDMap.value(col+1) == "MFK3_ECAN")
{
m_future = QString::number(tmp_lst[0]).toFloat(); //
m_future = m_future/10000000;
m_log << QString::number(tmp_lst[0]).toStdString() << ";";  //Row values
}
m_diff = std::abs(m_current - m_future); //

if (m_diff <= 3)
{ //details etc}
2

Другие решения

Я не могу сказать, что вы хотите от вашего описания. Может быть, поможет следующий тривиальный код?

long pre = -1;
for(int row = 0; row < tmp_lst.size(); row++)
{
//writing Row values
if (pre == -1 || ((long)tmp_lst.at(row) - pre) < 3000000) {
m_log << QString::number(tmp_lst.at(row)).toStdString() << ";";
} else {
m_log << ".dat file is corrup";
}
pre = tmp_lst.at(row);
}
0