はじめての C

関数 fopen の man page を 見ると、

a+ - 読み取り および 追加 (ファイルの 最後に 書き込む) のために 開く。 ファイルが 存在していない場合には 新たに 作成する。 ストリームは ファイルの 最後に 追加される。

mode 文字列には 文字 "b" を 追加指定することが できる。 これは 上述の うちの 2文字からなる 文字列では、最後の 文字としても、あるいは 2つの 文字の 間にも 指定できる。 これは ANSI X3.159.1989 ("ANSI C") との 互換性の ためだけに 用意されたものであり、関数の 実行に 対しては いかなる 影響も 持たない。 すなわち、Linux を 含む 全ての POSIX 準拠システムでは、この "b" は 無視される。(その他の システムでは テキストファイルと バイナリファイルを 別々に 扱うものも あるので、もし バイナリファイルの 入出力を 行い、その プログラムが 非 UNIX 環境へ 移植されると 予測するなら、"b" を 付けておくのは 良い 考えである)


ファイルを 追加モード (mode の 最初の 文字を a にする) で 開くと、この ストリームに 対する 書き込み操作は (先に
fseek(stream, 0, SEEK_END);
呼び出しを 実行したかのように) ファイルの 末尾に 対して 行われる。

と あるので、addbook.c の 該当個所を 次のように 書き換えた。

if )((fp = fopen(argv[1], "a+b"))( == NULL) {
fprintf(stderr, "Can't open %s.\n". argv[1]);
exit(2);
}
なんとか これで、データの 上書きは 防げそう ...