I/O流类库组成 • cin和cout的成员函数 • 流插入和流提取运算符的重载 • 文本文件的开关和读写
时间: 2025-07-05 08:03:59 浏览: 14
### C++ I/O 流类库的组成
C++ 的标准输入输出流主要由 `<iostream>` 头文件提供支持。该头文件定义了四个基本的对象用于处理控制台的标准输入和输出:
- `std::cin`:用于从标准输入设备(通常是键盘)读取数据。
- `std::cout`:用于向标准输出设备(通常是屏幕)发送数据。
- `std::cerr`:用于未缓冲的标准错误消息输出。
- `std::clog`:用于带缓冲的标准错误消息输出。
除了这些预定义对象外,还有其他重要的组件构成完整的I/O流框架,比如文件流 (`<fstream>`) 和字符串流 (`<sstream>`) 等[^1]。
### cin 和 cout 的成员函数
对于 `std::cin` 而言,常用的操作包括但不限于:
- 使用 `>>` 运算符逐个读入不同类型的数据项;
- 函数 `get()` 可以用来获取单字符或一系列字符直到遇到指定分隔符为止;
- 方法 `getline()` 适用于按行读取整个字符串;
而针对 `std::cout` 来说,则有如下特性:
- 同样通过 `<<` 符号可以连续地将多个表达式的值打印出来;
- 改变默认行为可以通过调用诸如 `setf()`, `unsetf()`, 或者设置精度等格式化选项来实现;
- 利用操纵器如 `\n` 实现换行功能,也可以借助于像 `endl` 这样的特殊对象完成相同目的并刷新缓存区[^2]。
### 流插入和流提取运算符的重载方法
为了使自定义类型的实例能够被方便地显示到屏幕上或是接收来自用户的输入,在 C++ 中允许程序员为特定类型重新定义这两个运算符的行为模式。下面给出了一种典型的方式来进行这样的操作:
#### 定义一个简单的类作为例子
```cpp
class Complex {
public:
double real;
double imag;
// 构造函数...
};
```
#### 对应的流插入运算符重载形式
```cpp
ostream& operator<<(ostream &out, const Complex &obj) {
out << obj.real << " + i*" << obj.imag;
return out;
}
```
这里返回的是左参数中的流对象本身以便链式调用。同样地,如果希望让程序可以从命令行直接接受复数类型的数值,则需另外编写相应的提取逻辑:
#### 流提取运算符重载的形式
```cpp
istream& operator>>(istream &in, Complex &obj) {
char ch;
in >> obj.real >> ch >> obj.imag;
if (ch != '+') {
in.setstate(ios_base::failbit);
}
return in;
}
```
上述代码片段假设输入遵循某种固定的格式,并且会在不符合预期的情况下标记输入失败状态。
### 文本文件的打开和读写操作
当涉及到持久化的存储需求时,通常会考虑利用文件系统保存信息。在 C++ 中,这可通过引入额外两个方向上的流——即文件输入流(`ifstream`)与文件输出流(`ofstream`)—来达成目标。此外还有一个双向版本叫做 `fstream` ,它既可用于读也可用于写的场合。
要创建一个新的文本文件或将现有文件的内容覆盖掉,只需简单声明一个 ofstream 类型变量并将所需路径传递给其构造函数即可:
```cpp
#include <fstream>
using namespace std;
// 创建/覆写文件
ofstream fout("example.txt");
if (!fout.is_open()) /* 错误处理 */;
else {
fout << "Writing to file.\n";
fout.close();
}
```
相反地,想要加载已有的文档内容则应该采用 ifstream :
```cpp
ifstream fin("example.txt");
string line;
while(getline(fin,line)){
cout << line << endl;
}
fin.close();
```
当然也存在更复杂的场景下需要同时具备这两种能力的情形,这时就轮到了 fstream 登场了。
阅读全文
相关推荐




















