如果我从不对打开的文件流调用“close”会怎样?
What happens if I never call `close` on an open file stream?
下面是相同案例的代码。
#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()
行会有什么不同?
没有区别。文件流的析构函数将关闭文件。
您也可以依靠构造函数来打开文件,而不是调用 open()
。您的代码可以简化为:
#include <fstream>
int main()
{
std::ofstream myfile("example.txt");
myfile << "Writing this to a file.\n";
}
中的一些参考来强化 juanchopanza 的回答
(destructor)
[virtual](implicitly declared)
destructs the basic_fstream and the associated buffer, closes the file
(virtual public member function)
在这种情况下,什么也不会发生,代码执行时间也非常少。
但是,如果您的代码长时间 运行 时,您一直在打开文件而不是关闭,那么在一定时间后,可能会在 运行 时间内崩溃。
当您打开文件时,操作系统会创建一个条目来表示该文件并存储有关该打开文件的信息。因此,如果在 OS 中打开了 100 个文件,那么 OS 中将有 100 个条目(内核中的某处)。这些条目由整数表示,例如 (...100, 101, 102....)。此条目号是文件描述符。所以它只是一个整数,唯一代表操作系统中打开的文件。如果您的进程打开 10 个文件,那么您的进程 table 将有 10 个文件描述符条目。
此外,如果您一次打开大量文件,这就是为什么您可以 运行 超出文件描述符的原因。这将阻止 *nix 系统 运行ning,因为它们总是打开描述符来填充 /proc。
所有操作系统都应该发生类似的事情。
正常情况下没有区别。
但是 在特殊情况下(稍作更改)关闭调用可能会导致异常。
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.
}
}
下面是相同案例的代码。
#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()
行会有什么不同?
没有区别。文件流的析构函数将关闭文件。
您也可以依靠构造函数来打开文件,而不是调用 open()
。您的代码可以简化为:
#include <fstream>
int main()
{
std::ofstream myfile("example.txt");
myfile << "Writing this to a file.\n";
}
(destructor)
[virtual](implicitly declared)destructs the basic_fstream and the associated buffer, closes the file (virtual public member function)
在这种情况下,什么也不会发生,代码执行时间也非常少。
但是,如果您的代码长时间 运行 时,您一直在打开文件而不是关闭,那么在一定时间后,可能会在 运行 时间内崩溃。
当您打开文件时,操作系统会创建一个条目来表示该文件并存储有关该打开文件的信息。因此,如果在 OS 中打开了 100 个文件,那么 OS 中将有 100 个条目(内核中的某处)。这些条目由整数表示,例如 (...100, 101, 102....)。此条目号是文件描述符。所以它只是一个整数,唯一代表操作系统中打开的文件。如果您的进程打开 10 个文件,那么您的进程 table 将有 10 个文件描述符条目。
此外,如果您一次打开大量文件,这就是为什么您可以 运行 超出文件描述符的原因。这将阻止 *nix 系统 运行ning,因为它们总是打开描述符来填充 /proc。
所有操作系统都应该发生类似的事情。
正常情况下没有区别。
但是 在特殊情况下(稍作更改)关闭调用可能会导致异常。
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.
}
}