2012-08-27 107 views
0

考虑以下代码:当我使用open()功能ifstream :: open()真的做什么?

ifstream filein; 

filein.open("y.txt"); 

,会发生什么?

  • 文件流本身是否打开?

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

  • 或两者兼而有之?

+0

http://en.cppreference.com/w/cpp/io/basic_ifstream/open? – rve

回答

2

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

3

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

1

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

2

std::ifstream设置为拥有std::filebuf这是从std::streambuf派生的类。流缓冲区以通用方式管理流的缓冲,并抽象流的访问细节。对于std::filebuf,底层流是根据需要访问的操作系统文件。当调用std::ifstream::open()时,该呼叫主要委托给std::filebuf::open(),该实际工作完成。但是,如果呼叫std::filebuf::open()成功,则std::ifstream将其状态位设为clear(),如果呼叫失败,则设置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_streambuf,和std::basic_ofstream),它们是typedef“ED上述用于实例化上char工作作为一个字符类型中使用的名称。有类似的typedef s使用w前缀用于在wchar_t上工作的实例。有趣的是,char16_tchar32_t版本没有typedef s,它似乎也有点工作让它们实例化。