|
> 下記のプログラムは、ファイルの20バイト目にデータを書きこもうとしています。
> やはり追加書き込みモードにしているからファイルの最後尾に書きこんでしまう
> のでしょうか?
> fp=fopen("FILE.txt","a+");
次のように書けば、よいでしょう。
fp = fopen("FILE.txt", "r+");
if (fp == NULL) {
fp = fopen("FILE.txt", "w+")
if (fp == NULL) error("can't open FILE.txt");
}
実は、私は、fopen の "a" については誤解をしていました。
fopen が内部で呼び出している open のモード指定で、O_APPEND は、lseek による
ファイルオフセットの位置にかかわらず、write が常にファイルの末尾になることは
知っていたのですが、fopen の実装は、K&R2 の第8章にあるように、普通に open して
どこにでも seek できて、そこに write できるものだと思っていました。
しかし、fopen のソースをいくつか見てみると、
"r" は open(path, O_RDONLY)
"w" は open(path, O_WRONLY | O_CREAT | O_TRUNC)
"a" は open(path, O_WRONLY | O_CREAT | O_APPEND)
になっていました。
"+" があると、O_RDONLY や O_WRONLY の代わりに O_RDWR になります。
|