2017-07-11 210 views
0

我有日誌數據範圍從1000到100000項來自不同的來源。目標是按時間(快速)對這些數據進行分類。我在C原型,我卡住,因爲它看起來像tm不支持毫秒。我在這裏錯過了什麼嗎?有什麼建議麼 ?time.h - 結構tm和毫秒

理念:

  1. 打開文件。通過strtok逐行解析字段並將其標記爲c struct

    1.1轉換日期&到「struct tm」的時間。

    1.2生成鏈接列表

  2. 基於時間排序鏈表(不知道我會用它的排序算法)
  3. 輸出

[例]

YYYY-MM-DD,HH:MM:SS:MS , PID, TID , COMPONENT, Message 
2017-03-29,20:56:27:088, 3436,2568,COMPONENT, Message String blah blah 
2017-03-29,20:56:27:089, 3436,2568,COMPONENT, Message String baaaaa 
2017-03-29,20:56:27:079, 3436,2568,COMPONENT, Message String roarrr 
2017-03-29,20:56:28:061, 3436,2568,COMPONENT, Message String meow 
2017-03-29,20:56:25:044, 3436,2568,COMPONENT, Message String ruff ruff 
. 
. 
. 
100000 entries 

const char T[] = "2017-03-29,20:56:27:088"; //Test String 
time_t result = 0; 
int year = 0, month = 0, day = 0; 
int hour = 0, min = 0, sec = 0, ms = 0; 

if (sscanf(T, "%4d-%2d-%2d,%2d:%2d:%2d", &year, &month, &day, &hour, &min, &sec) == 6) { 
    struct tm tv = {0}; 
    tv.tm_year = year; 
    tv.tm_mon = month; 
    tv.tm_mday = day; 
    tv.tm_hour = hour; 
    tv.tm_min = min; 
    tv.tm_sec = sec; 
    //Crap, it doesn't look like tm handles milliseconds ???? 

    if ((result = mktime(&tv)) == (time_t)-1) { 
     fprintf(stderr, "Conversion Error\n"); 
    } 
    puts(ctime(&result)); 
} 
else { 
    fprintf(stderr, "Invalid Format\n"); 
} 
+3

C++有一個[chrono's high_resolution_clock](http://en.cppreference.com/w/cpp/chrono/high_resolution_clock),它的持續時間可以像毫秒一樣輕鬆地轉換成_「A,B,C,1,2 ,3「_。話雖如此,請考慮從C問題中刪除'C++'標記。他們是兩種不同的語言。 – Ron

+5

你使用C還是C++?他們是不同的語言。 – NathanOliver

+0

檢查回購:https://github.com/izaak-coleman/chronoBench。如果你可以使用C++,你可以使用它。 –

回答

1

您可以從mktime中獲取結果並將其轉換爲毫秒。

if ((result = mktime(&tv)) == (time_t)-1) { 
    fprintf(stderr, "Conversion Error\n"); 
} 
long long resultmilli = (result * 1000LL) + ms; 
4

我不明白爲什麼你需要的時間戳轉換爲struct tm,或到任何其他表示。他們已經按照他們當前的字符串形式按照您想要的方式按字典順序排序。所以就這樣做。

+0

謝謝...我會嘗試這種方法。 – Matt