我真的需要注释的 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会回来咬你的屁股。
另外,它也更安全,因为如果您关闭它,它就不会被意外写入或读取。如果您没有在专业环境中工作过,这可能看起来很愚蠢,在这种环境中,多人使用相同的代码,但防御性编程是一个非常有用且必不可少的工具。
以下程序摘自 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会回来咬你的屁股。 另外,它也更安全,因为如果您关闭它,它就不会被意外写入或读取。如果您没有在专业环境中工作过,这可能看起来很愚蠢,在这种环境中,多人使用相同的代码,但防御性编程是一个非常有用且必不可少的工具。