如果我从不在打开的文件流上调用`close`会发生什么?

时间:2015-01-31 15:58:10

标签: c++ file filestreams

以下是相同案例的代码。

#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 个答案:

答案 0 :(得分:26)

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

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

#include <fstream>

int main()
{
  std::ofstream myfile("example.txt");
  myfile << "Writing this to a file.\n";
}

答案 1 :(得分:9)

通过std::fstream documentation

的一些参考来巩固juanchopanza的答案
  

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

     

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

答案 2 :(得分:5)

在这种情况下,不会发生任何事情,代码执行时间也会非常少。

但是,如果您的代码在连续打开文件而未关闭时长时间运行,则在一段时间后,运行时可能会崩溃。

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

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

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

答案 3 :(得分:1)

在正常情况下没有区别。

在异常条件下(略有变化),对close的调用可能会导致显示。

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.
    }
}