|
> 例) 戦歴は20行で、5戦分記録しておきたい。100行に到達したら
> 先頭の20行を消し、追加書き込みを行う。
すみません。1ゲームの戦歴が 5行で、20戦分記録しておくものと勘違いしていました。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define FNAME "history.txt"
#define RECLINES 20
#define MAXLINES 100
int update(char **record)
{
char *line[MAXLINES], buf[1024];
int i, n;
FILE *fp = fopen(FNAME, "r+");
if (fp == NULL&& (fp = fopen(FNAME, "w")) == NULL) return 0;
for (n = 0; n < MAXLINES && fgets(buf, sizeof buf, fp); n++)
if ((line[n] = strdup(buf)) == NULL) puts("out of memory"), exit(1);
rewind(fp);
for (i = (n==MAXLINES) ? RECLINES : 0; i < n; i++)
fputs(line[i], fp);
for (i = 0; i < RECLINES; i++)
fputs(record[i], fp);
fclose(fp);
for (i = 0; i < n; i++)
free(line[i]);
return 1;
}
int main(void)
{
char *record[] = {
"Tue Dec 31 00:20:14 2002\n", "Akira\n", "Hiroshi\n", "--------\n",
"abcd\n", "efgh\n", "ijkl\n", "mnop\n", "qrst\n", "uvwx\n", "yzAB\n",
"CDEF\n", "GHIJ\n", "KLMN\n", "OPQR\n", "STUV\n", "WXYZ\n", "1234\n",
"5678\n", "---------\n",
};
time_t t = time(0);
record[0] = ctime(&t);
if (!update(record))
return printf("can't open history file\n"), 1;
return 0;
}
行の長さにかかわらず、固定長の 2次元配列を用意するのは気に入らないので、
動的に確保するようにしました。
それにしても、どうして、1ゲームの戦歴に 20行も必要なんでしょうか。
オセロは、60手で勝負がつくので、盤面の位置を a〜z、A〜Z、1〜8 の 60文字で表せば、
1行で戦歴を表せると思うのですが。
|