I/O Stream¶
约 591 个字 96 行代码 1 张图片 预计阅读时间 3 分钟
using 语句属于特定作用域,其作用范围持续到其所在块结束。
- cin:标准输入流,用于读取用户输入
- cout:标准输出流,用于输出信息(无缓冲)
- cerr:标准错误流,用于输出错误信息(无缓冲)
- clog:标准日志流,用于记录非关键事件的日志(有缓冲)

类层次结构解析¶
- 顶层基类
ios_base:所有 I/O 相关类的基类,提供基本的 I/O 状态管理、格式化控制等功能。basic_ios:继承自ios_base,是basic_istream和basic_ostream的共同基类,负责流的状态管理、错误处理等。
- 基本输入/输出流
basic_ostream(输出流基类):用于输出数据,如std::cout。basic_istream(输入流基类):用于输入数据,如std::cin。basic_iostream(输入输出流):同时支持输入和输出,继承自basic_istream和basic_ostream。
- 字符串流(处理
std::string)
basic_ostringstream:继承自basic_ostream,用于写入字符串流(std::ostringstream)。basic_istringstream:继承自basic_istream,用于读取字符串流(std::istringstream)。basic_stringstream:继承自basic_iostream,支持字符串的读写(std::stringstream)。
- 文件流(处理文件 I/O)
basic_ofstream:继承自basic_ostream,用于文件写操作(std::ofstream)。basic_ifstream:继承自basic_istream,用于文件读操作(std::ifstream)。basic_fstream:继承自basic_iostream,用于同时读写文件(std::fstream)。
std::cout 流是 std::ostream 的一个实例,std::cin 流是 std::istream 的一个实例。
字符串流¶
getline 函数接口为 istream& getline(istream& is, string& str, char delim)
getline()读取一串输入流is,直到读取字符delim时停止,将读到的数据存入缓冲区str中delim默认为\ngetline()读取的数据是会把字符delim“消耗(consumes)” 掉,也会读取这个字符
输出流¶
输出流的字符在被释放(flush)到目的地之前会被存储在一个中间缓冲区内,std::endl 除了换行之外,还会立即执行一次 flush 操作。
输出文件流(output file streams)的类型为 std::ofstream,同样采用 << 插入符将数据送入文件内。
std::ofstream 常用的几种方法有
is_open()open()close()fail()
输入输出流的运算符重载与链式调用¶
std::cin 的类型与 operator>> 重载¶
std::cin 的类型是 std::istream(输入流),其中对各种基本类型重载了 operator>>。例如:
为什么 operator>> 返回 istream&¶
返回 istream&(即 *this)的目的是支持链式调用:
这样可以连续多次输入,语法简洁。
std::cout 的类型与 operator<< 重载¶
与 cin 类似,std::cout 的类型是 std::ostream(输出流),它同样对各种基本类型重载了 << 运算符。例如:
用户自定义类型的输入输出重载¶
对于自定义类型(如 Complex),可以通过重载 operator>> 和 operator<< 实现流式输入输出。通常写成友元函数:
这样就可以像内置类型一样使用 cin >> c 或 cout << c 了。
我们可以还自定义操纵符(Manipulators):