1. C++ IO流概述
在C++编程中,IO流(Input/Output Stream)是处理数据输入输出的核心机制。作为C++标准库的重要组成部分,IO流提供了一套面向对象的接口,使得程序与外部设备(如键盘、显示器、文件等)之间的数据传输变得简单高效。
IO流的核心思想是将数据的输入输出抽象为"流"的概念。想象一下水流通过管道的情景 - 数据就像水流一样,可以从源头(输入设备)流向程序,或者从程序流向目的地(输出设备)。这种抽象屏蔽了底层硬件细节,让开发者能够专注于业务逻辑的实现。
C++标准库提供了丰富的流类,主要分为以下几类:
- 标准输入输出流:处理控制台输入输出(cin/cout/cerr/clog)
- 文件流:处理文件读写(ifstream/ofstream/fstream)
- 字符串流:在内存中处理字符串(istringstream/ostringstream/stringstream)
- 其他特殊流:如处理宽字符的wcin/wcout等
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 标准IO流详解
2.1 基本流对象
C++预定义了四个标准流对象,无需创建即可直接使用:
cpp复制#include <iostream>
std::cin; // 标准输入流,通常对应键盘
std::cout; // 标准输出流,通常对应显示器
std::cerr; // 标准错误流(无缓冲),通常输出错误信息
std::clog; // 标准日志流(有缓冲),用于记录日志
这些对象都定义在std命名空间中,使用时需要包含
2.2 流操作符
C++重载了<<和>>操作符用于流的输入输出:
cpp复制int age;
std::cout << "请输入您的年龄:";
std::cin >> age;
std::cout << "您的年龄是:" << age << "岁\n";
<<操作符(插入操作符)用于输出,>>操作符(提取操作符)用于输入。它们可以链式使用,自动处理基本数据类型的格式转换。
注意:使用cin进行输入时,如果输入类型与变量类型不匹配,会导致流进入错误状态。此时需要调用cin.clear()清除错误标志,并可能需要忽略缓冲区中的错误数据。
2.3 格式化输出
C++提供了多种方式控制输出格式:
- 使用流操纵符(需要包含
):
cpp复制#include <iomanip>
double pi = 3.141592653589793;
std::cout << std::fixed << std::setprecision(4) << pi; // 输出:3.1416
- 使用成员函数:
cpp复制std::cout.precision(4);
std::cout.setf(std::ios::fixed);
std::cout << pi;
常用格式化选项包括:
- std::setw(n):设置字段宽度
- std::setfill(c):设置填充字符
- std::left/std::right:设置对齐方式
- std::hex/std::oct/std::dec:设置进制
3. 文件IO流
3.1 文件流类
C++通过以下类处理文件IO:
cpp复制#include <fstream>
std::ifstream; // 输入文件流(只读)
std::ofstream; // 输出文件流(只写)
std::fstream; // 文件流(读写)
3.2 文件操作基本步骤
- 打开文件:
cpp复制std::ofstream outFile;
outFile.open("data.txt", std::ios::out | std::ios::app);
打开模式标志:
- std::ios::in:读方式打开
- std::ios::out:写方式打开
- std::ios::app:追加模式
- std::ios::binary:二进制模式
- std::ios::trunc:如果文件存在则清空
- 检查文件是否成功打开:
cpp复制if(!outFile.is_open()) {
std::cerr << "无法打开文件!\n";
return 1;
}
- 读写文件:
cpp复制// 写入文件
outFile << "Hello, File IO!" << std::endl;
// 从文件读取
std::ifstream inFile("data.txt");
std::string line;
while(std::getline(inFile, line)) {
std::cout << line << '\n';
}
- 关闭文件:
cpp复制outFile.close();
inFile.close();
提示:虽然流对象析构时会自动
