ifstream::open()真正的作用是什么
What does ifstream::open() really do?
考虑以下代码:
ifstream filein;
filein.open("y.txt");
当我使用open()
函数时,会发生什么?
文件流本身是否被打开?
还是对象的状态变为打开?
还是两者兼而有之?
不清楚您是想知道实现细节还是标准要求,但关于实现细节,它将调用操作系统上的底层开放系统调用。例如,在Linux上,这被称为open
。在Windows上,它被称为CreateFile
。
打开或关闭的文件流由其状态表示。因此,如果将状态更改为打开,文件流现在就是打开的。就像一个门口。如果你打开它,你已经将它的状态更改为打开位置。然后你可以稍后关闭它,这包括将它的状态更改为关闭位置。将其状态更改为打开和打开流完全相同。
std::ifstream
设置为拥有一个std::filebuf
,该CCD_5是从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
),它们与上面用于将char
作为字符类型进行实例化的名称类似。对于在wchar_t
上工作的实例,存在使用w
前缀的类似typedef
。有趣的是,char16_t
和char32_t
版本没有typedef
,而且似乎还需要一些工作来实例化它们。
如果您从逻辑上思考,ifstream只是我们将从中获取文件内容的流。我们提供给ifstream.open()的参数将打开文件并将其标记为打开。当文件被标记为打开时,它将不允许您对文件执行某些操作,如在某些程序打开文件时重命名文件。它将允许您在关闭流后执行同样的操作。ifstream-imo只是访问文件的辅助类。
- "using namespace std;"在C++的作用是什么?
- 此代码中的" "是什么,它的基本作用是什么?
- 在模板参数中使用 {} 在 type_trait{} 中时,其作用是什么<T>?
- <<、>>算子在循环中的作用是什么
- 在c++中,减号和加号对字符串的作用是什么
- 窄集(_cast)的作用是什么
- 在这种情况下,#define 的作用是什么?
- 遍历模板参数包,没有争论的专业化的作用是什么?
- 在 c++ 中,没有 **std::fixed** 的 **std::setprecision()** 的作用是什么?
- 访问多个阵列时 CPU 缓存的作用是什么?
- 以下表达式的作用是什么:x = (a1,a2,..,n);
- 私人成员的作用是什么?
- 这段代码的作用是什么?
- *.exp文件的作用是什么
- ifstream::open()真正的作用是什么
- 如何在矩阵中使用指针.这行代码的作用是什么:int r=**(++b);
- 这个函数的作用是什么?与夹紧值有关
- 这个运算符()语法的作用是什么
- std::函数的模板参数中“const”修饰符和引用的作用是什么
- 字符串流在C++编程中的作用是什么