まずは、ファイルをオープンするための関数を作りましょう。 このとき、ファイルを新規に作ってオープンするのか、 すでにあるファイルをオープンするのかでオープンの仕方が 違ってきます。fopen関数のヘルプを今一度よく読んでみてください。 新規にオープンする場合、レコード番号は当然1にします。 すでに存在するファイルをオープンするには、このファイルから レコード番号を読み出します。 ここで新しく必要となる関数は、
ですね。ファイルの読み書きしている 場所を移動させる関数です。 最初の引数はFILE構造体へのポインタです。 次の引数は、基準点からのバイト数です。 これが、longであることに注意してください。 最後の引数は 基準点を指定します。0ならファイルの先頭、1なら ファイルポインタの位置(読み書きしている位置)、 2ならファイルの最後からという意味になります。 また、これらをSEEK_SET, SEEK_CUR, SEEK_ENDという定数で 表すこともあります。#include <stdio.h> int fseek(FILE *stream,long offset,int orign);
新規のファイルのオープンに失敗したら−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レコード分の長さになります。
このプログラムを動かすとすぐにわかることですが、 非常にまずい問題点があります。 名前のところで苗字と名前の間に半角 スペースを入れてみてください。
Update Dec/19/1996 By Y.Kumei