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