1.3 データファイル読み書き



next up previous contents

Next: References Up: 1 カー・ナビゲーション Previous: 1.2 ナビゲーション・システムに必要なデータ構造


1.3 データファイル読み書き

先に作成したデータはコンピュータのメモリに記憶されるので,プログラムの終 了と共に消えてしまいます.そこで,永久的に消えないところにデータを記憶 する必要があります.通常のナビゲーションシステムでは,CD-ROMに記憶され ていることが多いようです.ここでは,コンピュータの記憶媒体として最も良 く用いられるハードディスクに記憶してみましょう.

練習問題 1-4

  1. 先に作成した構造体データをテキストにて,ファイルに出力してみなさい.なお,データファイルはコンマ(,)で区切って一行に1つの交差点のデータとして,次のようにつくりなさい.

    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
                                         :

  2. テキストのデータファイルはUNIXの"less"コマンドでその内容をみることができる.lessコマンドを使ってデータファイルの内容が希望通りの形式で作成されているか確認せよ.

  3. 逆に,ファイルからデータを構造体へ読み込み,画面に表示してみなさい.

-----------------------
/* 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のデータを画面に表示するプログラムを記入しなさい */
}
-----------------------



next up previous contents

Next: References Up: 1 カー・ナビゲーション Previous: 1.2 ナビゲーション・システムに必要なデータ構造




機械・知能系 コンピュータ実習担当教官