C言語関係掲示板

過去ログ

No.387.ファイル位置指定

[戻る] [ホームページ]
No.2627

ファイル位置指定
投稿者---まつ(2002/09/06 18:23:10)


ファイルに指定した位置に書き込みたいのですが、指定した場所から読み込むことができても、ファイルの最後の位置にしかデータを書きこんでくれません。

下記のプログラムは、ファイルの20バイト目にデータを書きこもうとしています。
やはり追加書き込みモードにしているからファイルの最後尾に書きこんでしまうのでしょうか?
何かいい方法がありましたら教えてください。

set=20;

fp=fopen("FILE.txt","a+");
fseek(fp,set,SEEK_SET);
fprintf(fp,"%s %d %d %d\n",abc,a,b,c);
fclose(fp);

No.2635

Re:ファイル位置指定
投稿者---かずま(2002/09/08 02:11:47)


> 下記のプログラムは、ファイルの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 になります。

No.2639

Re:ファイル位置指定
投稿者---はち(2002/09/08 19:42:27)



>> fp=fopen("FILE.txt","a+");
>
>次のように書けば、よいでしょう。
><pre>
fp = fopen("FILE.txt", "r+");
if (fp == NULL) {
fp = fopen("FILE.txt", "w+")
if (fp == NULL) error("can't open FILE.txt");
}

さっそくアドバイス通りやってみました.
おかげで指定した位置に書き込む事ができました.
かずまさん本当にありがとうございます.