考虑这段代码:
ifstream filein;
filein.open("y.txt");
当我使用该open()
功能时,会发生什么?
文件流本身是否被打开?
还是对象的状态变为打开?
或两者?
考虑这段代码:
ifstream filein;
filein.open("y.txt");
当我使用该open()
功能时,会发生什么?
文件流本身是否被打开?
还是对象的状态变为打开?
或两者?
不清楚你是想知道实现细节还是标准要求——但至于实现细节——它将调用操作系统上的底层开放系统调用。例如,在 Linux 上,这称为open
. 在 Windows 上,它被称为CreateFile
.
std::ifstream
设置为拥有 a 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_filebuf
、std::basic_streambuf
和std::basic_ofstream
),它们被typedef
编入上面用于char
作为字符类型的实例化的名称。有类似typedef
的 s 使用w
前缀来进行实例化wchar_t
。有趣的是, and版本没有typedef
s ,而且让它们实例化似乎也需要一些工作。char16_t
char32_t
打开或关闭的文件流由它的状态表示。因此,如果您将状态更改为打开,则文件流现在已打开。就像一个门廊。如果您打开它,您已将其状态更改为打开位置。然后您可以稍后将其关闭,这涉及将其状态更改为关闭位置。将其状态更改为打开和打开流是完全相同的事情。
如果您从逻辑上思考, ifstream 只是我们将在其中获取文件内容的流。我们提供给 ifstream.open() 的参数将打开文件并将其标记为打开。当文件被标记为打开时,它将不允许您对文件执行某些操作,例如在某些程序打开文件时重命名文件。它允许您在关闭流后执行相同的操作。ifstream - imo 只是访问文件的辅助类。