第44章 ランダム・アクセスファイル その1  


以前第18章19章20章で簡単な ファイルの取り扱いをしました。これは、いわゆる 「シーケンシャル・ファイル」といわれるもので、 読み書きは、ファイルの最初から順番に行うものでした。 今回は、「ランダム・アクセスファイル」です。 名前の通り、ファイルのいろいろなところにアクセスしようと いうものです。

今回は、簡単です!!

ファイルに記録する場合、たとえば「氏名」「住所」「年齢」など のひとかたまりの記録をレコードといいます。(不正確な言い方です) たとえば、10人分の記録をしたとすればレコードは10個です。 そして、「氏名」「住所」「年齢」などの項目をフィールドといいます。 ランダムにアクセスするには、それぞれのフィールドの長さを一定に しなくてはいけません。(それでないと特定のレコードの特定のフィールド の位置が特定できません。当たり前ですが・・)それで、今回は それぞれのフィールドの長さが一定のファイルを作るプログラムを 紹介します。

まずは、ファイルをオープンするための関数を作りましょう。 このとき、ファイルを新規に作ってオープンするのか、 すでにあるファイルをオープンするのかでオープンの仕方が 違ってきます。fopen関数のヘルプを今一度よく読んでみてください。 新規にオープンする場合、レコード番号は当然1にします。 すでに存在するファイルをオープンするには、このファイルから レコード番号を読み出します。 ここで新しく必要となる関数は、

#include <stdio.h> int fseek(FILE *stream,long offset,int orign);

ですね。ファイルの読み書きしている 場所を移動させる関数です。 最初の引数はFILE構造体へのポインタです。 次の引数は、基準点からのバイト数です。 これが、longであることに注意してください。 最後の引数は 基準点を指定します。0ならファイルの先頭、1なら ファイルポインタの位置(読み書きしている位置)、 2ならファイルの最後からという意味になります。 また、これらをSEEK_SET, SEEK_CUR, SEEK_ENDという定数で 表すこともあります。

新規のファイルのオープンに失敗したら−1を すでに存在するファイルのオープンに失敗したら−2を 返すようにしてみましょう。成功したら0をかえす ようにします。

FILE構造体へのポインタfpやレコード番号noは、 別なところでも使いそうなので グローバル変数としました。従ってこの関数内では宣言して いません。

fseek(fp, 0L, 0);

は今回のレコード番号の取得です。(最初の5バイトの所に レコード番号を記録するようにする)

さて、次に書き込みのための関数write_fileを作りましょう。 とりあえず、名前、住所、誕生日の項目を作ります。 それぞれ、20,30,20バイトとります。 NAME_SIZE, ADDRESS_SIZE, BIRTH_SIZEは最初に #defineしておきます。 どこに書き込むかというと、1レコードが 70バイトですから、70*(レコード番号−1)バイト目 それに、最初のレコード番号記録用の場所(5バイト)を 加えたところですね。そして、最後に次のレコード番号を ファイルの最初に書き込んで一連の作業は終わりです。

名前の入力のところで「E」を入力すると無限ループを 脱出するようにしました。もう少しスマートな 方法を考えてみてください。

さて、最後はmain関数からこれらの関数を 呼び出せばよいだけですね。

マクロが2重に使われています。 TOTAL_SIZEをそれぞれのサイズの和としています。 これが、1レコード分の長さになります。

このプログラムを動かすとすぐにわかることですが、 非常にまずい問題点があります。 名前のところで苗字と名前の間に半角 スペースを入れてみてください。

ありゃーーー!

と言うことになります。 これは、入力にscanfを使っているためです。 scanfはあくまでも、学習用の(?)関数で いろいろ問題点があり実際にはほとんど 使われていません。 第6章でもそのことに触れました。 これが気にくわない人は、ヘルプでいろいろ調べて scanf以外の関数を使ってみてください。 気に入ったものができたら、自分専用のライブラリを 作りましょう。ライブラリの作り方は簡単です。 マニュアルかヘルプで調べてみましょう。 それでもうまく行かないときは、お金を出して ライブラリを買いましょう。雑誌等によく広告が出ています。 (そんなに高額ではない。)このHPを見ている人は、 Cの専門家になる人ではないので お金で解決できることは どんどんお金で解決してください。(何という大胆な発言!)


[Index][総合Index] [Previous Chapter] [Next Chapter]

Update Dec/19/1996 By Y.Kumei
当ホーム・ページの一部または全部を無断で複写、複製、 転載あるいはコンピュータ等のファイルに保存することを禁じます。