2

私は、ファイルに書き込まれたときに構造体内にあった特定の文字列をファイルで検索するプログラムに取り組んでいます。そのファイル内で一致するものが見つかった場合、その構造体の一部を上書きする必要があります。一致するファイルを検索するのは非常に簡単ですが、その構造体を上書きするのに苦労しています。以下は、ファイルを検索してそのデータを上書きしようとしている私のコードです。

dfp = fopen(archName, "ab");
    if(dfp == NULL) {
        printf("An error has occurred... %s could not be opened.\n", archName);
        return 0;
    } /* End if */

    /* Read first header file */
    fread(&getHeader, sizeof(getHeader), 1, dfp);

/* Check for match */
    if(strcmp(fName[0], getHeader.file_name) == 0) {
        getHeader.deleted = (char)49;
        fwrite(&getHeader, sizeof(getHeader), 1, dfp);

getHeaderは構造体であることに注意してください。私のファイルのどこにでも保存できる複数の構造体があります。各ヘッダーで特定の文字列を検索する必要があります(簡単)。一致するものが見つかった場合、その構造体を上書きする必要があります。

そのようなタスクを達成するためにどのようなプロセスが推奨されますか?

4

1 に答える 1

6

一度に 1 つずつ、レコードをレコード構造に読み取るループを作成できます。読み取るたびに、読み取ったレコードと目的のレコードを比較し、必要なレコードでない場合は次のレコードを読み取ることができます。

欲しかったレコードを見つけたばかりですが、レコードを超えて読んだだけでもあります。レコードを上書きするには、シークバックする必要があります。C標準では、そうしないと動作が未定義であると規定されているため、毎回、読み取りと書き込みの間、またはその逆をシークする必要があります。つまり、書き込みの前にシークし、次のレコードに戻る前に別のシークを行います。

モードでファイルを開いたので"ab"、すべての書き込みが最後に追加されるため、シークは重要ではありません。あなたはおそらく"r+b"モードとしてfopen().

同じ一般的な問題に関する最近の議論のfseek()値を書き込むときに、ファイルの最後に戻るを参照してください。

于 2013-03-01T03:11:39.163 に答える