○ ログファイルを解析するアプリのひな型をC++で作る
ログファイルとして作成したファイルを解析する必要が出てきた時に、いちいちアプリを作成するのが面倒です。
そのため、すぐに作成できるひな型を作成します。
実行ファイルにログファイルをドラッグアンドドロップすると、解析結果を out.txt に書き出す。
この単純な機能のプログラムを作成しました。
#include <conio.h>
#include <stdio.h>
#include <Windows.h>
#define BUFF_SIZE 0x800
char buff[BUFF_SIZE];
#pragma warning(disable : 4996)
int main(int argc, char* argv[]) {
if (argc > 1) {
FILE *fp, *w_fp;
if ((fp = fopen(argv[1], "r")) == NULL || (w_fp = fopen("out.txt", "w")) == NULL) {
printf("ファイルが開けません\n");
}else {
while (fgets(buff, BUFF_SIZE, fp) != NULL) {
//ココでbuff内に格納された1行毎の文字列を解析する
fprintf(w_fp,"%s", buff);//out.txtファイルに書き出す
}
fclose(w_fp);
fclose(fp);
}
}
else {
printf("%s\n", "ファイルをドラッグするか、引数にファイル名を指定してください");
}
end:
printf("何かキーを押すと終了します");
//system("pause");
getch();
return 0;
}
上記のプログラムを改造しました。
1行毎に11文字前進させて、先頭に a の文字があった場合には、CSV形式の8個目の文字を切り出してファイルに保存する
このような動作をするプログラムです。
#include <conio.h>
#include <stdio.h>
#include <Windows.h>
#define BUFF_SIZE 0x800
char buff[BUFF_SIZE];
char* buff_pt;
#pragma warning(disable : 4996)
//一つの文字での切り出し
//区切り文字の間に値が無い場合には空白文字を切り出します。
//先頭に区切り文字は必要ないです
char* str_split(char* buf, char c) {
static char* _buff;
if (buf) _buff = buf;//バッファに文字列が来たら保存する
if ('\0' == *_buff) return NULL; //バッファの先頭が終端文字だとNULLを返す
char* head = _buff;//先頭の位置を保存する
while (*_buff) {
if (c == *_buff) {
*_buff = '\0';
_buff++;
break;
}
_buff++;
}
return head;
}
int main(int argc, char* argv[]) {
if (argc > 1) {
FILE *fp, *w_fp;
if ((fp = fopen(argv[1], "r")) == NULL || (w_fp = fopen("out.txt", "w")) == NULL) {
printf("ファイルが開けません\n");
}else {
while (fgets(buff, BUFF_SIZE, fp) != NULL) {
//ココでbuff内に格納された1行毎の文字列を解析する
buff_pt = buff;
buff_pt = buff_pt + 11;//11文字前進させて
if ('a' != *buff_pt) continue;//aという文字が無ければ次の行
char* r;
r = str_split(buff_pt, ',');//バッファを指定して1つ目の区切り文字を切り出す
r = str_split(NULL, ',');//2つ目の区切り文字を切り出す
r = str_split(NULL, ',');
r = str_split(NULL, ',');
r = str_split(NULL, ',');
r = str_split(NULL, ',');
r = str_split(NULL, ',');
r = str_split(NULL, ',');//8つ目の区切り文字を切り出す
if (r) {//8つ目の区切り文字が存在している場合
fprintf(w_fp, "%s", r);//out.txtファイルに書き出す
}
}
fclose(w_fp);
fclose(fp);
}
}
else {
printf("%s\n", "ファイルをドラッグするか、引数にファイル名を指定してください");
}
end:
printf("何かキーを押すと終了します");
//system("pause");
getch();
return 0;
}
▲トップページ