C++的IO流深入理解(下)

1.C++ 文件 IO 流(文件交互)

文件流类继承自标准 IO 流,因此也支持<</>>运算符,同时扩展了文件操作的专属功能。

1. 核心文件流类
类名 继承关系 作用
ifstream istream 输入文件流(读取文件)
ofstream ostream 输出文件流(写入文件)
fstream iostream 双向文件流(读写文件)
2. 基础用法

文件打开方式:通过构造函数或open()函数打开文件,可指定模式:

模式 作用
ios::in 读文件(默认ifstream)
ios::out 写文件(默认ofstream,会清空原文件)
ios::app 追加写入(不清空文件,末尾添加)
ios::trunc 清空文件(配合ios::out使用)
ios::binary 二进制模式读写(不处理换行符)

示例:

cpp 复制代码
// 方式1:构造函数直接打开
ofstream ofs("test.txt", ios::app); 
// 方式2:先创建对象,再open
ifstream ifs;
ifs.open("test.txt", ios::in);

打开状态判断:通过!ifs或ifs.is_open()判断文件是否成功打开:

cpp 复制代码
if (!ifs.is_open()) {
    cerr << "文件打开失败!" << endl;
    return -1;
}

文件读写操作:

文本模式(默认):用<</>>读写,或getline读取整行:

cpp 复制代码
ofs << "hello world" << endl; // 写入文本
string line;
getline(ifs, line); // 读取整行

二进制模式:用read()/write()直接按字节读写,适合非文本数据(如图片、结构体):

cpp 复制代码
char buf[1024];
ifs.read(buf, sizeof(buf)); // 读取二进制数据
ofs.write(buf, sizeof(buf)); // 写入二进制数据

文件关闭:析构函数会自动调用close(),也可手动关闭释放资源。

2. 随机访问文件

通过文件指针操作实现文件的随机读写,核心函数:

1.seekg(pos):设置读指针位置(g=get)

2.seekp(pos):设置写指针位置(p=put)

3.tellg()/tellp():获取当前读 / 写指针位置

示例:

cpp 复制代码
ifs.seekg(0, ios::end); // 读指针移到文件末尾
long size = ifs.tellg(); // 获取文件大小
ifs.seekg(0, ios::beg); // 读指针移回文件开头

3.stringstream 的简单介绍

1. 核心类:
类名 作用
istringstream 从字符串中读取数据(输入流)
ostringstream 向字符串中写入数据(输出流)
stringstream 支持读写双向操作
2. 常见应用场景
场景 1:数据类型转换(安全替代 C 的atoi/sprintf)
cpp 复制代码
// 数字转字符串
int num = 12345;
stringstream ss;
ss << num;
string str = ss.str(); // str = "12345"

// 字符串转数字
string s = "6789";
int n;
ss.clear(); // 重置流状态(关键!)
ss.str(s);
ss >> n; // n = 6789
场景 2:字符串分割(按空格 / 指定分隔符)
cpp 复制代码
string line = "apple banana orange";
stringstream ss(line);
string fruit;
while (ss >> fruit) { // 按空格分割
    cout << fruit << endl;
}
场景 3:高效拼接字符串
cpp 复制代码
ostringstream oss;
oss << "姓名:" << "张三" << ", 年龄:" << 18;
string info = oss.str(); // 比多次用+拼接更高效

4. 关键注意事项

1.重复使用stringstream时,需先调用ss.clear()重置流状态,再用ss.str("")清空底层字符串,否则残留数据会影响后续操作。

2.转换失败时,流会设置failbit,需通过ss.fail()检查状态。

补充:流的继承关系图


谢谢

相关推荐
布莱克6052 小时前
C/C++ 中变量的声明与定义:区别、联系与常见误区
c语言·开发语言·c++·声明·定义
LabVIEW开发2 小时前
LabVIEW 局部变量为何引发竞争条件?四种同步机制
开发语言·labview
benchmark_cc3 小时前
A 股、港股、美股如何建立统一的标的主数据格式?
开发语言·python·数据分析·pandas·量化交易·股票数据·quantdash
Zenova EdgeOS4 小时前
Go 工业边缘错误处理实战:用 errors 构建可追溯错误链
开发语言·数据库·golang
取名真是4 小时前
Python 算法知识点从基础到进阶
开发语言·python·算法
FRing034 小时前
vue2干货总结3(computed计算属性、watch监听器)
开发语言·前端·vue.js·vue2
Fatbobman(东坡肘子)5 小时前
快速消失的硬盘容量 -- 肘子的 Swift 周报 #160
开发语言·人工智能·redis·ios·swiftui·iphone·swift
揽星河..6 小时前
【C语言】底层程序设计
c语言·开发语言
JavaPub-rodert6 小时前
从零搭建通用管理后台:ShiyuAdmin 的 Go、React 与 RBAC 实践
开发语言·react.js·golang
沫璃染墨6 小时前
从零入门计算机网络系列(十二):HTTP长连接与会话管理详解——从Connection到Cookie与Session
linux·服务器·c++·tcp/ip·ubuntu·http·交互