0

考虑这段代码:

ifstream filein;

filein.open("y.txt");

当我使用该open()功能时,会发生什么?

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

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

  • 或两者?

4

4 回答 4

3

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

于 2012-08-27T20:34:22.587 回答
2

std::ifstream设置为拥有 a std::filebuf,它是派生自 的类std::streambuf。流缓冲区以通用方式管理流的缓冲,并抽象出如何访问流的细节。对于std::filebuf底层流是根据需要访问的操作系统文件。何时std::ifstream::open()调用此调用主要委托给std::filebuf::open()哪个执行实际工作。但是,如果调用成功,std::ifstream则将clear()其状态位,如果调用失败,则设置。文件缓冲区将调用系统的方法来分配文件句柄,如果成功,则安排此文件句柄在其析构函数或函数中释放 - 无论先到先得。打电话时std::filebuf::open()std::ios_base::failbitstd::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),它们被typedef编入上面用于char作为字符类型的实例化的名称。有类似typedef的 s 使用w前缀来进行实例化wchar_t。有趣的是, and版本没有typedefs ,而且让它们实例化似乎也需要一些工作。char16_tchar32_t

于 2012-08-27T21:17:09.697 回答
2

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

于 2012-08-27T21:05:54.313 回答
1

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

于 2012-08-27T20:50:22.107 回答