3

次のコードブロックを参照してください。fcloseを呼び出す前にFILEオブジェクトが閉じられていないことを確認するにはどうすればよいですか?ところで、fcloseを2回呼び出すのは安全ですか?

    FILE* f = fopen('test.txt')

    //some code here, f may be closed by someone, but they may not set it to NULL
    ...


    /// I want to make sure f is not closed before, how can I do it here?
    if(...)
    {
       fclose(f)
    }
4

3 に答える 3

6

いいえ、自分で追跡する必要があります。これは、割り当てられたブロックへのポインタが解放されたかどうかを確認するという質問に類似しています。ポインタが無効になっているため、このようなテストを実行する方法はありません。同じことが。にも当てはまりますFILE *。ファイルを閉じた後、基になるオブジェクトにアクセスしようとすると、未定義の動作が発生します。

更新しました:

Linuxのmanページを引用するには、次の点に注意してください。

ストリームパラメータが
不正なポインタ、または前の呼び出しにすでに渡された記述子です。
fclose()の陽イオン。

未定義の動作は、クラッシュしたり、「機能」しないことを意味するものではないことに注意してください。これは、特定の動作が保証されておらず、操作が安全でないことを意味します。FILE後で構造体にアクセスすることfclose()は非常に悪い考えです。

于 2013-02-28T01:56:28.217 に答える
3

プログラム内のどこかでfclose()を呼び出すときは常に、次のようにFILE *ファイルポインタをNULLに設定する必要があります。これは、後でファイルの最後のクリーンアップ中に確認できます。

fclose(f)
f = NULL;

ファイルの最後にあるクリーンアップセクションは次のようになります。

if (f != NULL)
{
    fclose(f);
    f = NULL;
}
于 2013-02-28T01:51:54.150 に答える
-1

android-bionicのfcloseソースコードを貼り付けます:(fclose.cファイル)

int fclose(FILE *fp)
{
    int r;

    if (fp->_flags == 0) {  /* not open! */
        errno = EBADF;
        return (EOF);
    }
    FLOCKFILE(fp);
    WCIO_FREE(fp);
    r = fp->_flags & __SWR ? __sflush(fp) : 0;
    if (fp->_close != NULL && (*fp->_close)(fp->_cookie) < 0)
        r = EOF;
    if (fp->_flags & __SMBF)
        free((char *)fp->_bf._base);
    if (HASUB(fp))
        FREEUB(fp);
    if (HASLB(fp))
        FREELB(fp);
    fp->_r = fp->_w = 0;    /* Mess up if reaccessed. */
    fp->_flags = 0;     /* Release this FILE for reuse. */
    FUNLOCKFILE(fp);
    return (r);
}

閉じたFILEオブジェクトでfcloseを呼び出すのは安全なようです。

于 2013-02-28T02:29:02.543 に答える