ifstream :: open()真的有用吗?

时间:2012-08-27 20:30:24

标签: c++ file-io filestream fstream

考虑以下代码:

ifstream filein;

filein.open("y.txt");

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

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

  • 或对象的状态更改为打开?

  • 或两者兼而有之?

4 个答案:

答案 0 :(得分:3)

目前尚不清楚您是否想了解实施细节或标准要求 - 但至于实施细节 - 它将在操作系统上调用底层开放系统调用。例如,在Linux上,这称为open。在Windows上,它被称为CreateFile

答案 1 :(得分:2)

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

答案 2 :(得分:2)

std::ifstream设置为拥有std::filebuf,这是一个派生自std::streambuf的类。流缓冲区以通用方式管理流的缓冲,并抽象出如何访问流的细节。对于std::filebuf,基础流是根据需要访问的操作系统文件。调用std::ifstream::open()时,此调用主要委托给执行实际工作的std::filebuf::open()。但是,如果调用std::ifstream成功,clear()std::filebuf::open()其状态位,如果调用失败,则设置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_ifstream的所有模板(std::basic_filebufstd::basic_streambufstd::basic_ofstreamtypedef)上面用于作为字符类型处理char的实例化。对typedef工作的实例化使用w前缀有类似的wchar_t。有趣的是,typedefchar16_t版本没有char32_t个版本,似乎也可以将它们实例化。

答案 3 :(得分:1)

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