标准库 iostream 的包含与继承关系
发布日期: 2024-01-07
概览
包含(include):
- <ios>
- <streambuf>
- <istream>
- <ostream>
对象:
- cin & wcin
- cout & wcout
- cerr & wcerr
- clog & wclog
标准库 ios
类:
- ios_base
- basic_ios
- std::ios & std::wios
其中, std::ios
的定义为 std::basic_ios<char>
, std::wios
的定义为 std::basic_ios<wchar_t>
, basic_ios 继承自 ios_base
函数:
- uppercase & nouppercase: 控制输出大写字母
- internal & left & right: 设置填充字符的位置
- dec & hex & oct: 修改输入输出的基数
标准库 istream
类模板和 typedef:
- basic_istream & basic_iostream
- std::istream & std::wistream
- std::iostream & std::wiostream
其中, std::istream
定义为 std::basic_istream<char>
, 其余的也类似
继承关系如下:
ios_base <--- basic_ios <--- basic_istream <---\
\--- basic_ostream <--- basic_iostream
类 istream
全局对象:
- cin & wcin
成员函数:
- get
- getline
- read
标准库 ostream
类:
- basic_ostream
- std::ostream & std::wostream
其中, std::ostream
定义为 std::basic_ostream
, 其余类似
继承关系如下:
ios_base <--- basic_ios <--- basic_ostream
操作符:
- endl
- ends
- flush
函数:
- print(C++23)
- println(C++23)
类 ostream
全局对象:
- cout & wcout
- cerr & wcerr
- clog & wclog
成员函数:
- put
- teelp
标准库 fstream
类:
- basic_ifstream
- basic_ofstream
- ifstream & ofstream
其中, std::ifstream
定义为 std::basic_ifstream
, 其余类似
继承关系如下:
ios_base <--- basic_ios <--- basic_istream <--- basic_ifstream
类 ifstream
成员函数:
- is_open
- open
- close
类 ofstream 中, 也有这几个函数
总结
文件包含关系, 有尖括号 <> 的代表文件, 其余代表类:
<iostream>
|---<ios>
. |---<iosfwd>
. |---ios_base
. |---basic_ios
|---<istream>
. |---ostream
. |---iostream
|---<ostream>
. |---ostream
<fstream>
|---ifstream
|---ofstream
类的继承关系:
图片来源: cppreference.com
关于格式化输出
cout 定义于 标准库 <iostream> 文件中, 该文件包含 <ostream> 文件:
extern std::ostream cout
extern std::wostream wcout
cout 是 ostream 类的对象, 而 ostream 类继承于 ios_base, 大部分的格式化方法都在 ios_base 类中, 例如 setf() 方法, 所以可以有 std::cout.setf()
的用法
std::right 与 std::ios::right
std::right
或 std::dec
等常量的原型在 <ios> 文件中定义:
std::ios_base& left(std::ios_base& str);
std::ios
是 std::basic_ios<char>
的别名, 类 basic_ios 是继承于 ios_base 的, 实际上也是访问的 ios_base 中的常量, 从这一层面上来说, std::ios::right
与 std::ios_base::right
也相同 (但 basic_ios 是模板类, 可能在某些情况下有区别吧)
简单的示例:
设置流的宽度:
cout.width(12); // 流宽度设置为 12
setw(12); // 流宽度设置为 12
// setw() 方法会使用流的 width() 方法, 它们是相同的
右对齐:
double a = 3.14159;
setw(12) // 或者 cout.width(12)
cout.setf(ios::right);
// output
// 3.14159
setf() 多标记组合:
cout.setf(ios::right | ios::showpos);
// 因为 setf(flags) 即使处理单标记, 也是 fl = fl | flags, 所以可以用管道符号分隔标记
设置浮点数精度
double a = 3.14159;
cout.precision(3); // 有效位数, 而非小数位数
// output
// 3.14