如何检测 FILE 对象是否已关闭?

Pat*_*ick 3 c fclose

请参阅以下代码块,如何在调用 fclose 之前确保 FILE 对象未关闭?顺便说一句,两次调用 fclose 是否安全?

    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)
    }
Run Code Online (Sandbox Code Playgroud)

Fat*_*ror 6

不,你必须自己跟踪它。这类似于判断指向已分配块的指针是否已被释放的问题。由于指针不再有效,因此无法进行此类测试。这同样适用于FILE *。关闭文件后,任何访问底层对象的尝试都会导致未定义的行为。

更新:

当心,引用 Linux 手册页:

如果流参数是一个,则 fclose() 的行为未定义
非法指针,或者描述符是否已经传递给前一个 invo?
fclose() 的阳离子。

请记住,未定义的行为并不意味着它会崩溃或不会“工作”。这意味着不能保证特定的行为并且操作是不安全的。FILE在之后访问结构fclose()是一个非常糟糕的主意。