13

「a+b」モードを使用してファイルを開きたいです。つまり、存在しない場合は自動的に作成されますが、存在する場合は上書きしたくありません。ファイルを読み書きできるようにしたい。

ファイルはバイナリであり、特定のレコードを保存したいと考えてstructいます。だから私は欲しいfseek()レコードにやりたいと思って、それを使ってレコードを保存しfwrite()ます。

コードは次のようになります (MyRecordは aにtypedefstructはファイル名に):FILENAME#define

int saveRecord(MyRecord *pRecord, int pos)
{
    FILE* file = fopen(FILENAME, "a+b");
    if (file == NULL)
    {
        printf("Unable to open file %s\n", FILENAME);
        return 0;
    }

    fseek(file, pos * sizeof(MyRecord), SEEK_SET);
    fwrite(pRecord, sizeof(MyRecord), 1, file);
    fclose(file);
    return 1;
}

ただし、このコードは、0 に設定した場合でも、レコードをファイルの最後に追加するだけです。追加モード で動作しposないのはなぜですか?fseek()SEEK_SET

「r + b」で簡単に開くことができ、失敗した場合は「wb」で開くことができることはわかっていますが、これが機能しない理由fseek()SEEK_SET、最後にファイルポインターが残っている理由を知りたいです。この動作が文書化されている場所への参照は大歓迎です (何も見つからなかったか、間違ったキーワードを使用しているため)。

4

3 に答える 3

20

これは、aモードでは、FILE*常に最後に追加するためです。fseekこのモードでは読み取りポインタのみを設定します。これは、C 標準7.19.5.3 fopenで文書化されています。

追加モード ('a'モード引数の最初の文字として) でファイルを開くと、そのファイルへの後続のすべての書き込みは、関数への介在呼び出しに関係なく、その時点でのファイルの終わりに強制されますfseek

于 2011-04-03T20:51:06.017 に答える
4

「r+b」モードを使用し、失敗した場合は「w+b」にフォールバックします。

「a+b」モードでは、読み取りと追加が可能です。「r+b」は、ランダムな読み取りと書き込みを可能にします。

のドキュメントでfopenは、さまざまなモードでファイルがどのように動作するかについて説明しています。

于 2011-04-03T20:46:45.050 に答える
4

プレーン C には、目的を達成するための適切な方法がありません。POSIX システムまたはリモートに近いものを使用している場合は、fd=open(FILENAME, O_CREAT|O_RDRW, 0666)andを使用できますfdopen(fd, "rb+")

編集:プレーンCで試すことができるもう1つのこと:

f = fopen(FILENAME, "a+b");
if (!f) /* ... */
tmp = freopen(0, "r+b", f);
if (tmp) f = tmp;
else /* ... */
于 2011-04-03T21:11:19.110 に答える