先に作成したデータはコンピュータのメモリに記憶されるので,プログラムの終 了と共に消えてしまいます.そこで,永久的に消えないところにデータを記憶 する必要があります.通常のナビゲーションシステムでは,CD-ROMに記憶され ていることが多いようです.ここでは,コンピュータの記憶媒体として最も良 く用いられるハードディスクに記憶してみましょう.
練習問題 1-4
id, x, y, wait, name, points, next[0], next[1], next[2], next[3], next[4] : cross[0]のデータ
id, x, y, wait, name, points, next[0], next[1], next[2], next[3], next[4] : cross[1]のデータ
:
従って,例えば,以下のようなデータファイルができる.
1, 3, 3, 30, 北四勾当台通り, 3 , 2, 1, 3
2, 2, 2, 60, 東2番丁定禅寺, 3 , 0, 3, 4
:
-----------------------
/* writefile.c --- */
#include <stdio.h>
#define CrossingNumber 5 /* 交差点数=5 */
#define MaxName 50 /* 最大文字数50文字(半角) */
typedef struct {
double x, y; /* 位置x, y */
} Position; /* 位置を表す構造体 */
typedef struct { /* 構造体の定義 */
int id; /* 交差点番号 */
Position pos; /* 位置を表す構造体 */
double wait; /* 平均待ち時間 */
char name[MaxName]; /* 交差点名 */
int points; /* 交差道路数 */
int next[5]; /* 隣接する交差点番号 */
} Crossing;
Crossing cross[CrossingNumber]; /* 交差点の変数宣言 */
void map_write(char *filename)
{
FILE *fp;
int i;
fp = fopen(filename,"w");
if (fp == NULL) {
printf("File %s is not created\n", filename);
return;
}
for (i = 0; i < CrossingNumber; i++) {
/* 関数fprintfを使って構造体のデータを
ファイルへ書き出すプログラムを記入しなさい */
}
fclose(fp);
}
void main(void)
{
int i;
... /* 構造体crossへデータを代入するプログラムを記入しなさい */
map_write("map.dat");
}
-----------------------
-----------------------
/* readfile.c --- */
#include <stdio.h>
#define CrossingNumber 5 /* 交差点数=5 */
#define MaxName 50 /* 最大文字数50文字(半角) */
typedef struct {
double x, y; /* 位置x, y */
} Position; /* 位置を表す構造体 */
typedef struct { /* 構造体の定義 */
int id; /* 交差点番号 */
Position pos; /* 位置を表す構造体 */
double wait; /* 平均待ち時間 */
char name[MaxName]; /* 交差点名 */
int points; /* 交差道路数 */
int next[5]; /* 隣接する交差点番号 */
} Crossing;
Crossing cross[CrossingNumber]; /* 交差点の変数宣言 */
void map_read(char *filename)
{
FILE *fp;
int i;
fp = fopen(filename, "r");
if (fp == NULL) {
printf("File %s is not read\n", filename);
return;
}
for (i = 0; i < CrossingNumber; i++) {
/* 関数fscanfを使ってファイルのデータを構造体へ入力する */
fscanf(fp,"%d,%lf,%lf,%lf,%[^,],%d,%d,%d,%d,%d,%d",
&(cross[i].id),
&(cross[i].pos.x), &(cross[i].pos.y),
&(cross[i].wait), cross[i].name,
&(cross[i].points),
&(cross[i].next[0]), &(cross[i].next[1]),
&(cross[i].next[2]), &(cross[i].next[3]),
&(cross[i].next[4]));
}
fclose(fp);
}
void main(void)
{
int i;
map_read("map.dat");
... /* 構造体crossのデータを画面に表示するプログラムを記入しなさい */
}
-----------------------