21

以下是相同案例的代码。

#include <iostream>
#include <fstream>

using namespace std;

int main () {
    ofstream myfile;
    myfile.open ("example.txt");
    myfile << "Writing this to a file.\n";
    //myfile.close();
    return 0;
}

如果我取消注释该行会有什么不同myfile.close()

4

4 回答 4

26

没有区别。文件流的析构函数将关闭文件。

您还可以依靠构造函数来打开文件,而不是调用open(). 您的代码可以简化为:

#include <fstream>

int main()
{
  std::ofstream myfile("example.txt");
  myfile << "Writing this to a file.\n";
}
于 2015-01-31T16:01:01.417 回答
9

通过文档中的一些参考来强化 juanchopanza 的答案std::fstream

(析构函数)
[虚拟](隐式声明)

破坏 basic_fstream 和相关的缓冲区,关闭文件 (虚拟公共成员函数)

于 2015-01-31T16:03:59.247 回答
5

在这种情况下,什么都不会发生,代码执行时间也非常少。

但是,如果您的代码在您不断打开文件而不关闭的情况下长时间运行,则在一定时间后,运行时可能会出现崩溃。

当您打开一个文件时,操作系统会创建一个条目来表示该文件并存储有关该打开文件的信息。因此,如果您的操作系统中打开了 100 个文件,那么操作系统中将有 100 个条目(在内核中的某个位置)。这些条目由整数表示,例如 (...100, 101, 102...)。这个条目号是文件描述符。所以它只是一个整数,唯一代表操作系统中打开的文件。如果您的进程打开 10 个文件,那么您的进程表将有 10 个文件描述符条目。

此外,如果您一次打开大量文件,这就是您可能会用完文件描述符的原因。这将阻止 *nix 系统运行,因为它们一直打开描述符以填充 /proc 中的内容。

在所有操作系统的情况下都应该发生类似的事情。

于 2015-01-31T16:20:02.353 回答
1

正常情况下没有区别。

但是在特殊情况下(略有变化),关闭调用可能会导致异常。

int main()
{
    try
    {
        ofstream myfile;
        myfile.exceptions(std::ios::failbit | std::ios::badbit);
        myfile.open("example.txt");

        myfile << "Writing this to a file.\n";


        // If you call close this could potentially cause an exception
        myfile.close();


        // On the other hand. If you let the destructor call the close()
        // method. Then the destructor will catch and discard (eat) the
        // exception.
    }
    catch(...)
    {
        // If you call close(). There is a potential to get here.
        // If you let the destructor call close then the there is
        // no chance of getting here.
    }
}
于 2015-02-03T03:34:34.520 回答