網頁

2020年4月10日 星期五

使用 C 讀取TSK log 檔案

TSK的 log 檔案是一個 2進制檔,每筆紀錄用 0x00 當作結束,
總長度0x63FFF byte (409600 byte) 如下圖:


接下來就是如何用 C語言來讀取這個檔案,程式內容說明如下: 
首先是開啟檔案(fopen()),從標準輸入(ARGV)讀入檔名,
每次讀入1個字元(fgetc())直到檔案結束(EOF),
fp = fopen (argv[file_cont], "r");
while((ch = fgetc(fp)) != EOF) {
  printf("%c", ch = (ch == '\0') ? '\n' : ch);
}


其中,ch = (ch == '\0') ? '\n' : ch
這是三元運算子,等效是:
if (ch == '\0')
  ch = '\n';

意思是,如果讀入的字元是 '\0' 就更換成 '\n' (換行符),然後印出
寫成精簡一點就是:
printf("%c", ch = (ch == '\0') ? '\n' : ch);

因為這 log 檔通常是 3個,所以外層加上一個迴圈可以讓使用者輸入多個檔案
for (file_cont = 1; file_cont < argc; file_cont++) {
. . .
. . .
}
這樣我就可以同時輸入多個檔案依序讀取並印出:
$./log_prog  LOG_1.DAT  LOG_2_DAT  LOG_3.DAT

或是用shell的集合功能可以少打一些字:
$./log_prog  LOG_{1,2,3}.DAT
 
完整程式碼如下:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
  FILE *fp;
  int file_cont;
  char ch;
  if (argc == 1)
    return 0;
  for (file_cont = 1; file_cont < argc; file_cont++) {
    printf("\n->>>>> File:%s <<<<<-\n", argv[file_cont]);
    fp = fopen (argv[file_cont], "r");
    while((ch = fgetc(fp)) != EOF)
      printf("%c", ch = (ch == '\0') ? '\n' : ch);

    printf("\n");
  }
  return 0;
}


輸出結果:


由於檔案很長所以可以利用導向符 ">" 輸出至檔案
$./log_prog  LOG_1.DAT  > log1.txt

這樣就可以用文字編輯器來開啟log1.txt



你可以參考:
1. 使用 Julia讀取TSK log檔案


沒有留言:

張貼留言