ifstream::open()真正的作用是什么

What does ifstream::open() really do?

本文关键字:作用 是什么 open ifstream      更新时间:2023-10-16

考虑以下代码:

ifstream filein;
filein.open("y.txt");

当我使用open()函数时,会发生什么?

  • 文件流本身是否被打开?

  • 还是对象的状态变为打开?

  • 还是两者兼而有之?

不清楚您是想知道实现细节还是标准要求,但关于实现细节,它将调用操作系统上的底层开放系统调用。例如,在Linux上,这被称为open。在Windows上,它被称为CreateFile

打开或关闭的文件流由其状态表示。因此,如果将状态更改为打开,文件流现在就是打开的。就像一个门口。如果你打开它,你已经将它的状态更改为打开位置。然后你可以稍后关闭它,这包括将它的状态更改为关闭位置。将其状态更改为打开和打开流完全相同。

std::ifstream设置为拥有一个std::filebuf,该CCD_5是从std::streambuf派生的类。流缓冲区以一种通用的方式管理流的缓冲,并抽象出如何访问流的细节。对于std::filebuf,底层流是根据需要访问的操作系统文件。当调用std::ifstream::open()时,此调用主要委托给执行实际工作的std::filebuf::open()。然而,如果对std::filebuf::open()的调用成功,则std::ifstreamclear()的状态位,如果调用失败,则设置std::ios_base::failbit。文件缓冲区将调用系统的方法来分配一个文件句柄,如果成功,则安排在其析构函数或std::filebuf::close()函数中释放该文件句柄——无论先发生什么。当使用默认参数调用std::ifstream::open()时,系统调用将检查文件是否存在、是否可访问、是否打开过多的文件句柄等。有一个std::ios_base::openmode参数可用于以某些方式修改行为,以及在调用std::ofstream::open()时使用不同的标志时。

std::filebuf::open()的调用是否有任何其他影响取决于实现。例如,实现可以选择获取一个字节序列并将其转换为字符。由于用户可以覆盖某些设置,特别是std::locale(请参阅std::streambuf::pubimbue()函数),因此在第一次读取之前不太可能发生太多情况。在任何情况下,打开文件本身后,任何操作的结果都不会影响任何状态标志。

顺便说一句,上面提到的类实际上是所有模板(std::basic_ifstreamstd::basic_filebufstd::basic_streambufstd::basic_ofstream),它们与上面用于将char作为字符类型进行实例化的名称类似。对于在wchar_t上工作的实例,存在使用w前缀的类似typedef。有趣的是,char16_tchar32_t版本没有typedef,而且似乎还需要一些工作来实例化它们。

如果您从逻辑上思考,ifstream只是我们将从中获取文件内容的流。我们提供给ifstream.open()的参数将打开文件并将其标记为打开。当文件被标记为打开时,它将不允许您对文件执行某些操作,如在某些程序打开文件时重命名文件。它将允许您在关闭流后执行同样的操作。ifstream-imo只是访问文件的辅助类。