C言語関係掲示板

過去ログ

No.1095 sscanfを使ってデータを格納するには

[戻る] [ホームページ]
No.14399

sscanfを使ってデータを格納するには
投稿者---正直(2004/06/03 00:42:41)



[20040601 09:00:00] smtp[1234]: smtp[36]: connect from tokyo1
[20040601 09:00:00] smtp[1234]: smtp[36]: from <・・・・・・・・・・・・・・・> size=1234 htpr=1
[20040601 09:00:10] smtp[1234]: smtp[36]: from delivae aaaaa
[20040601 09:00:10] smtp[44425]: smtp[128]: connect from osaka1
[20040601 09:00:11] smtp[44425]: smtp[128]: from <・・・・・・・・・・・・・・・> size=51 htpr=1
[20040601 09:00:00] smtp[44425]: smtp[128]: from delivae aaaaa
:
:


このようなデータがあるファイルに入っています。
この中から日付、時間、プロセスID(1番目のsmtpの番号)、スレッドID(2番目のsmtpの番号)
サイズ(size=XXXX)のデータを、sscanfで取り出し、格納していきたいのですが、
上手く行きません。
アドバイスお願いします

while(fgets(buff,sizeof buff,fp) != NULL) {
    sscanf(buff+20 "smtp[%s[^]]]: smtp[%s[^]]]:",pid,tid);
とか
    sscanf(buff+20 "smtp[%s[^]][^:]]: smtp[%s[^]][^:]]:%*[^\n]",pid,tid);
とか
    sscanf(buff+20, "smtp[^[][%s[^]][^:]]:%*%[^]:]]:", pid,tid);
とか
}


プロセスID、スレットIDを取得し、次のレコードのプロセスID、すれっとIDと一致した
ところのサイズ(size=XXXX)をとりたいのですが、プロセスID、スレットIDの[]の中が
上手く取り出すことができず、日付、時間、サイズ等を取り出すこもできません。



No.14404

Re:sscanfを使ってデータを格納するには
投稿者---RAPT(2004/06/03 01:36:48)


Win2ksp4/VC++6sp6

#include <stdio.h>

int main()
{
  const char *str="[20040601 09:00:00] smtp[1234]: smtp[36]: connect from tokyo1";
  char pid[10] = {0}, tid[10] = {0};
  sscanf(str, "%*[^a-z]%*[^0-9]%[0-9]%*[^0-9]%[0-9]", pid, tid);
  printf("pid=%s\n", pid);
  printf("tid=%s\n", tid);
  return 0;
}

分かるかとは思うが、念のため。
"%*[^a-z]" … アルファベットで始まる直前までスキップ
"%*[^0-9]" … 数字で始まる直前までスキップ
"%[0-9]"   … 数字文字列を入力対象とする


MSDN Library



No.14405

Re:sscanfを使ってデータを格納するには
投稿者---かずま(2004/06/03 02:17:05)


#include <stdio.h>

int main(void)
{
    char buf[1024];
    int n, year, month, day, hour, min, sec, pid, tid, size;

    while (fgets(buf, sizeof buf, stdin)) {
        n = sscanf(buf, "[%4d%2d%d%d:%d:%d] smtp[%d]: smtp[%d]%*[^>]> size=%d",
            &year, &month, &day, &hour, &min, &sec, &pid, &tid, &size);
        if (n < 8) continue;
        if (n == 8) size = 0;
        printf("%d/%02d/%02d %02d:%02d:%02d  pid=%-7d tid=%-4d size=%d\n",
            year, month, day, hour, min, sec, pid, tid, size);
    }
    return 0;
}



No.14406

ありがとうございました。
投稿者---正直(2004/06/03 09:06:38)


RAPT様、かずま様
サンプルありがとうございました。

質問時に書いたデータフォーマットと実際のデータフォーマット
と異なってしまいましたが、サンプルをもとにして取得すること
ができました。

ありがとうございました。