先に作成したデータはコンピュータのメモリに記憶されるので,プログラムの終 了と共に消えてしまいます.そこで,永久的に消えないところにデータを記憶 する必要があります.通常のナビゲーションシステムでは,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のデータを画面に表示するプログラムを記入しなさい */ }-----------------------