1

私はいくつかのコードを実行しようとしていますがfflush()、エラーがあります:

 Invalid file descriptor. File possibly closed by a different thread

コードの関連部分は次のとおりです。

    fhandle = fopen("dbfile.bin", "rbc");
    /* There is a valid dbfile.bin file - get file size */
    _fstat(_fileno(fhandle), &file_stat);
    printf("dbfile.bin size = %d\n", file_stat.st_size);

    g_tpd_list = (tpd_list*)calloc(1, file_stat.st_size);

    if (!g_tpd_list)
    {
        rc = MEMORY_ERROR;
    }
    else
    {
        fread(g_tpd_list, file_stat.st_size, 1, fhandle);
        fflush(fhandle);
        fclose(fhandle);
    }
4

2 に答える 2

1

'c'奇妙なことに、この動作は、モードをfopen呼び出しに渡しているという事実によって引き起こされているようです。ヘルプには、フラグについて次のように書かれています。

関連付けられたファイル名のコミット フラグを有効にして、fflush または _flushall が呼び出された場合にファイル バッファの内容が直接ディスクに書き込まれるようにします。

そのため、なぜそれがそのままの動作を引き起こしているのかわかりません。ただし、削除すると、fflush通話は機能します。このフラグによって、 が読み取りバッファをクリアする機能が無効fflushになり、常に書き込みバッファをクリアしようとする可能性があります。

于 2011-04-12T05:26:45.563 に答える
0

fflush書き込みバッファをフラッシュすることになっています。標準 Cfflushでは、読み取り専用ストリームで呼び出すのは未定義の動作です。Microsoft CRT はこのような呼び出しをエラーとして扱うようです。とにかくあなたの場合は必要ありませんfflush

UPD: コメントからの説明によると、私の提案は完全には正しくありません。Microsoft CRT には、fflush読み取りストリームに対する特別な意味があります。の効果をクリアします。ungetc

于 2011-04-12T05:09:47.210 に答える