C言語関係掲示板

過去ログ

No.486.アクセスカウンターの集計

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

初めて書き込みます
投稿者---パンダ(2002/11/23 22:16:46)


こんにちは 超初心者ですいません。

ホームページのプロバイダー提供のアクセスカウンターを
C言語で集計したいと 以前考えたのですが

メールで送られてくるアクセスカウンター情報をホストアドレス、回数
何度訪れたか 初めて訪れたか などに集計するのは どのように
アルゴリズムすれば言いのでしょうか ?

COUNT = [ 14617 ]
TIME = [ 00:13:11 ]
HOST = [ aaaa-00p0-00.ppp00.aaa.ad.jp ]
ADDR = [ 111.122.133.00 ]
AGENT = [ Mozilla/4.0 (compatible; MSIE 6.0; Windows 98) ]

形式でメールで配信されます 
ホームページを管理する方なら あってもいいツールのように思います。

このような複雑な処理は 100行ぐらいのコードで書き表せるものでしょうか? 超初心者なので 自分でも挑戦したいと思っていましたが
ぜんぜん検討がつかないのです
どうかアドバイスお願いします。

No.3565

Re:初めて書き込みます
投稿者---パンダ(2002/11/24 21:12:55)


#include<stdio.h>
#include<stdlib.h>

main()
{

FILE *fin;
char hako[256];
char file[20];
printf("入力ファイルを指定してください。\n");
gets(file);

fin=fopen(file,"r");

if(fin == NULL){printf("%sがオープンできません。\n",file);exit(1);}

while(fgets(hako,256,fin) != NULL){printf("%s",hako);}

fclose(fin);

}

これに構造体で処理すれば良いのか

しかし これは ファイルは読めるが 全部表示されてしまう
前のほうが見えない

自分で考えるか

No.3574

Re:初めて書き込みます
投稿者---ともじ(2002/11/26 00:47:43)


こんばんは。

>メールで送られてくるアクセスカウンター情報をホストアドレス、回数
>何度訪れたか 初めて訪れたか などに集計するのは どのように
>アルゴリズムすれば言いのでしょうか ?

とりあえず、HOSTアドレスの集計だけです。
多忙のため、あまりアドバイスできません。すみません。
#include <stdio.h>
#include <string.h>

int main(void)
{
	FILE *rfp, *wfp;
	fpos_t fpos;
	char s[256], s2[256], *p_s, *p_e;
	int cnt;
	
	if ((rfp = fopen("host.dat", "r")) == NULL) {
		printf("file open error!!\n");
		return (1);
	}
	if ((wfp = fopen("save.dat", "r+")) == NULL) {
		/* ファイルがなければ新規作成 */
		if ((wfp = fopen("save.dat", "w+")) == NULL) {
			printf("file open error!!\n");
			return (1);
		}
	}
	while (fgets(s, 256, rfp) != NULL) {
		if (strstr(s, "HOST") == NULL) continue; 
		if ((p_s = strchr(s, '[')) != NULL) {
			/* HOSTアドレス先頭にポインタ移動 */
			p_s += 2;
			if ((p_e = strrchr(s, ']')) != NULL)
				/* HOSTアドレスの最後に\0設定 */
				*(p_e - 1) = '\0';
			else 
				continue;
		}
		else
				continue;
		/* 一致HOSTアドレスをサーチ */
		while (1) {
			fgetpos(wfp, &fpos);
			if (fscanf(wfp, "%d %s", &cnt, s2) < 2) {
				/* 一致するものがなければ新規登録 */
				cnt = 1;
				if(fsetpos(wfp, &fpos) == 0) {
					fprintf(wfp, "%4d %s", cnt, p_s);
				}
				break;
			}
			if (strcmp(p_s, s2) == 0) {
				/* 一致したら個数をカウントアップして書き込み */
				cnt++;
				if(fsetpos(wfp, &fpos) == 0) {
					fprintf(wfp, "%4d %s", cnt, p_s);
					
				}
				break;
			}
		}
		fseek(wfp, 0L, SEEK_SET);
	}
	
	while (fscanf(wfp, "%d %s", &cnt, s2) == 2) {
		printf("%4d %s\n", cnt, s2);
	}
		
	fclose(rfp);
	fclose(wfp);
	
	return(0);
}





No.3607

Re:初めて書き込みます
投稿者---パンダ(2002/11/27 21:06:15)


>とりあえず、HOSTアドレスの集計だけです。
>多忙のため、あまりアドバイスできません。すみません。

ソースコードありがとうございます。

なるほど このように 記述すれば良いのですね。
コンパイルしましたら ファイルが生成されていました。
ありがとうございます。