まずは、ファイルをオープンするための関数を作りましょう。
このとき、ファイルを新規に作ってオープンするのか、
すでにあるファイルをオープンするのかでオープンの仕方が
違ってきます。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