|
>マルチスレッドか何かでしょうか?
>A で全部読み込んでから、B で書き込んでは駄目なんでしょうか?
>取り敢えず、ソースを提示してみてはどうでしょうか?
上手く説明できなくてごめんなさい。
えっと、「リアル監視モニター」(条件HITしたレコードを抜出してくる)みたいなのを作っています。
本番環境ではプログラムBの文字列(実際は可変長のシステムログ)はシステムダウンさせる時以外は不定期(秒数百件)にはかれるもので、プログラムAもシステムが稼動している間は常に監視をしているというものです。
簡易版ソースを載せておきます。
/*プログラムA*/
#include <stdio.h>
#include <process.h>
#include <string.h>
#define FILENAME_INPUT "XXXXXXXXXXXXXXXXXXX/input.txt" //INPUTファイルの名前
#define FILENAME_OUTPUT "XXXXXXXXXXXXXXXXXXX/output.txt" //OUTPUTファイルの名前
#define FILENAME_END "XXXXXXXXXXXXXXXXXXX/end.txt" //ENDファイルの名前
int main(void)
{
FILE *fpi; //INPUTFILEの構造体POINTER
FILE *fpo; //OUTPUTFILEの構造体POINTER
FILE *fpx; //ENDFILEの構造体POINTER
char buff1[1024]; //1レコードが入るどんがら
char *buff2="go"; //検索文字
char *ans; //検索結果の戻値
int z=0; //ループカウント
/*----FILEOPEN----*/
if ((fpi=fopen(FILENAME_INPUT,"r"))==NULL){ //INPUTファイルをオープン
exit(1);
}
fpo=fopen(FILENAME_OUTPUT,"a"); //OUTPUTファイルをオープン
printf("はじめ\n");
/*----検索処理----*/
while(1){ //永久ループ開始
++z;
if ((fgets(buff1,1024,fpi))!=NULL){ //1レコードをbuff1に入れちゃう
ans=strstr(buff1,buff2); //検索して戻値をansへ
if (ans!=NULL){ //検索HITした場合の処理
fputs(buff1,fpo); //output.txtに出力
}
}
if (z==100){ //100ループ毎に終わらすかどうか判断する
z=0;
if ((fpx=fopen(FILENAME_END,"r"))!=NULL){ //終了手段はend.txtを作成する
break; //end.txtがオープンできたら脱出!
}
}
}
fclose(fpi);
fclose(fpo);
fclose(fpx);
printf("おわり\n");
return 0;
}
/*プログラムB*/
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#define FILENAME_INPUT "XXXXXXXXXX/input.txt" //INPUTファイルの名前
int main(void)
{
/*----変数定義----*/
FILE *fpi; //INPUTFILEの構造体POINTER
int i; //レコードカウント
int j; //乱文字数カウント変数
int x; //アルファベット26文字どれかの番号をいれる
int c; //決定されたアルファベットをいれる
/*----FILEOPEN----*/
fpi=fopen(FILENAME_INPUT,"a"); //INPUTファイルオープン
/*----乱数系列の変更----*/
srand((unsigned) time(NULL));
printf("サクセイチュウアル\n");
/*----a〜zの文字列をjjjj個ずつiiiii行発生----*/
for (i=1;i<=1000;i++) //iレコード生成
{
for (j=0;j<999;j++) //乱文字j個生成
{
x=rand()%26;
c='a'+x; //ランダム数字をランダムアルファベットにする
putc(c,fpi);
}
fputs("\n",fpi); //最後に\nを付加して改行
}
fclose(fpi);
printf("オワタアル\n");
return 0;
}
|