考虑以下代码:
ifstream filein;
filein.open("y.txt");
当我使用open()
函数时会发生什么?
文件流本身是否已打开?
或对象的状态更改为打开?
或两者兼而有之?
答案 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_filebuf
,std::basic_streambuf
,std::basic_ofstream
和typedef
)上面用于作为字符类型处理char
的实例化。对typedef
工作的实例化使用w
前缀有类似的wchar_t
。有趣的是,typedef
和char16_t
版本没有char32_t
个版本,似乎也可以将它们实例化。
答案 3 :(得分:1)
如果您从逻辑上思考,ifstream只是我们将获取文件内容的流。我们提供给ifstream.open()的参数将打开文件并将其标记为打开。当文件被标记为打开时,它将不允许您对文件执行某些操作,例如重命名某个程序打开的文件。关闭流后,它将允许您执行相同操作。 ifstream - imo只是访问文件的助手类。