我真的需要注释的 fclose() 命令吗?

Do i really need commented fclose() commands?

以下程序摘自 Johnson M. Hart 的 Windows System Programming(第四版):

#include<stdio.h>
#include<errno.h>

#define BUF_SIZE 256

int main(int argc, char *argv[])
{
    FILE *inFile, *outFile;
    size_t bytesIn, bytesOut;
    char rec[BUF_SIZE];

    if (argc != 3) {
        printf("Syntax : scp source destination.\n");
        return 1;
    }

    inFile = fopen(argv[1], "rb");
    if (inFile == NULL) {
        perror(argv[1]);
        return 2;
    }

    outFile = fopen(argv[2], "wb");
    if (outFile == NULL) {
        perror(argv[2]);
        //fclose(inFile);
        return 3;
    }

    while ((bytesIn = fread(rec, 1, BUF_SIZE, inFile)) > 0) {
        bytesOut = fwrite(rec, 1, bytesIn, outFile);
        if (bytesIn != bytesOut) {
            perror("Fatal write error.");
            //fclose(inFile); fclose(outFile);
            return 4;
        }
    }

    fclose(inFile);
    fclose(outFile);
    return 0;
}

关闭或不关闭注释行中的文件都一样。
但是,在阅读了以前的帖子后,我不确定什么是最佳做法。
让 OS 完成它的工作,还是在我认为应该的时候关闭它们?
我这样说是因为我在 windows GUI 应用程序中看到过这样的情况,当我关闭手柄而不是 OS 时,我在屏幕上造成了一个小故障,我实际上是在延迟 OS 因为我像许多 C++ 书籍所说的那样进行清洁。
我在这里没有使用任何东西 windows...这是一个 CRT 实现,但仍然...

现代操作系统将释放未释放的终止进程的资源,例如 malloc 已分配的内存、文件描述符等。因此理论上,如果您不需要关闭描述符无论如何都要结束这个程序。

不管你是对的,我认为这是不好的做法,我建议程序员总是释放资源并关闭文件描述符,即使是像你这样的小而琐碎的程序。稍后当你在一个更大的项目中工作时,你必须管理资源,你可能会忘记在真正需要时进行清理,因为你已经从琐碎的例子中学会了不要关心它。这就是为什么我认为这样做是一个很好的做法,即使对于像您这样的微不足道的例子也是如此。

I am saying this because i have seen situations in windows GUI apps that when i close the handles instead of the OS i am causing a small glitch on the screen and I am essentially delaying the OS because I do the cleaning like many C++ books say.

我不知道,也许您关闭了错误的文件描述符(或您不应该关闭的文件描述符)或关闭的时间不正确。没有代码很难说这是不是真的。

如果整个程序在 fclose 之后结束,那也没什么区别。然而,通常情况并非如此。您通常打开一个文件,向其中写入一些内容,如果您不关闭它,那么您将无法重新打开它,任何其他程序也无法这样做。另外,如果你只是继续打开文件,那么当 OS 需要关闭所有文件时,终止时会有很大的开销。但是,如果您在不再需要它们时关闭它们,那么它会在程序 运行.

期间随着时间的推移均匀分布。

把它想象成在图书馆里。如果你从书架上取下一堆书并没有把它们放回去,但实际上什么也没有发生,因为图书管理员会把它们放回去(尽管他会忙于这件事很长一段时间)。然而,如果你拿了一堆书,但不使用它们,只是把它们堆在你的桌子上,而且你很长时间都没有离开,那么图书馆里的其他人将无法一直这样使用它们。

即使您的程序确实终止了也使用 fclose 的原因是可伸缩性,因为如果您不这样做然后改进它,或者将它用作其他程序中的函数等,那么所有这些都将被遗漏 fcloses会回来咬你的屁股。 另外,它也更安全,因为如果您关闭它,它就不会被意外写入或读取。如果您没有在专业环境中工作过,这可能看起来很愚蠢,在这种环境中,多人使用相同的代码,但防御性编程是一个非常有用且必不可少的工具。