1.C 语言的输入与输出1. 核心 IO 函数场景函数作用标准输入 / 输出printf/scanf格式化打印、读取数据文件 IOfopen/fclose/fprintf/fscanf/fread/fwrite文件的打开关闭、读写操作2.典型痛点1.类型不安全printf/scanf依赖格式符如%d/%s格式符与变量类型不匹配会导致未定义行为甚至内存错误。2.缓冲区问题输入输出缓冲区的残留如scanf留下的换行符会干扰后续操作需要手动处理。3.错误处理繁琐scanf失败后不会自动终止后续输入会被持续阻塞需手动判断返回值。4.面向对象支持差无法直接输出自定义类型如结构体、类对象需要手动写格式化逻辑。5.资源管理麻烦文件句柄、缓冲区需手动管理容易出现内存泄漏或文件未关闭的问题。2.流是什么“流” 是 IO 操作的抽象模型也是理解 CIO 流的基础。1. 定义流是数据从源端到目的端的有序、连续传输通道可以类比现实中的 “水流”源端数据的生产者如键盘、文件、内存字符串目的端数据的消费者如屏幕、文件、内存字符串流的方向输入流数据流入程序、输出流数据流出程序2. 核心特性单向性基础流分为输入 / 输出两种方向双向流是两者的组合。缓冲性为减少直接 IO 的开销流会先将数据存入内存缓冲区缓冲区满 / 程序结束 / 主动刷新时再将数据写入设备。抽象性程序无需关心底层设备差异键盘 / 文件 / 网络只需通过统一的流接口操作数据。3. 流的分类按交互对象标准 IO 流与控制台键盘 / 屏幕交互文件 IO 流与磁盘文件交互字符串流与内存中的字符串交互stringstream3.CIO 流C 的 IO 流是一套面向对象的类层次结构所有流类都继承自ios_base核心分支如下ios_base → ios → istream/ostream → iostream/ifstream/ofstream/stringstream1 .C 标准 IO 流控制台交互标准 IO 流是 C 预定义的全局流对象属于istream/ostream的实例。2.核心对象对象类型作用缓冲特性cinistream标准输入流键盘读取有缓冲coutostream标准输出流屏幕打印有缓冲cerrostream标准错误流错误信息打印无缓冲直接输出clogostream标准日志流日志信息打印有缓冲3.关键特性与用法运算符重载插入运算符输出和提取运算符输入是 CIO 流的核心支持链式调用且自动处理类型无需格式符int a 10; double b 3.14; string s hello; cout a a , b b , s s endl; // 自动适配类型流状态位流操作会维护 4 种状态位用于判断操作是否成功1.goodbit操作正常2.eofbit读取到文件 / 输入末尾3.failbit操作失败如类型不匹配4.badbit流发生严重错误如设备故障5.可通过cin.fail()/cin.clear()/cin.ignore()检查、重置状态或清空缓冲区。格式化控制通过iomanip头文件的函数控制输出格式cout fixed setprecision(2) 3.14159; // 保留2位小数输出3.14 cout setw(5) 10; // 设置输出宽度为5默认右对齐4.endl与\n的区别1.endl输出换行符 强制刷新缓冲区2.\n仅输出换行符不刷新缓冲区效率更高推荐优先使用5. 常见坑与解决方案cin s遇到空格会停止读取字符串需用getline(cin, s)读取整行。混合使用cin和getline时cin残留的换行符会被getline读取需用cin.ignore()清空缓冲区。谢谢
C++的IO流深入理解(上)
1.C 语言的输入与输出1. 核心 IO 函数场景函数作用标准输入 / 输出printf/scanf格式化打印、读取数据文件 IOfopen/fclose/fprintf/fscanf/fread/fwrite文件的打开关闭、读写操作2.典型痛点1.类型不安全printf/scanf依赖格式符如%d/%s格式符与变量类型不匹配会导致未定义行为甚至内存错误。2.缓冲区问题输入输出缓冲区的残留如scanf留下的换行符会干扰后续操作需要手动处理。3.错误处理繁琐scanf失败后不会自动终止后续输入会被持续阻塞需手动判断返回值。4.面向对象支持差无法直接输出自定义类型如结构体、类对象需要手动写格式化逻辑。5.资源管理麻烦文件句柄、缓冲区需手动管理容易出现内存泄漏或文件未关闭的问题。2.流是什么“流” 是 IO 操作的抽象模型也是理解 CIO 流的基础。1. 定义流是数据从源端到目的端的有序、连续传输通道可以类比现实中的 “水流”源端数据的生产者如键盘、文件、内存字符串目的端数据的消费者如屏幕、文件、内存字符串流的方向输入流数据流入程序、输出流数据流出程序2. 核心特性单向性基础流分为输入 / 输出两种方向双向流是两者的组合。缓冲性为减少直接 IO 的开销流会先将数据存入内存缓冲区缓冲区满 / 程序结束 / 主动刷新时再将数据写入设备。抽象性程序无需关心底层设备差异键盘 / 文件 / 网络只需通过统一的流接口操作数据。3. 流的分类按交互对象标准 IO 流与控制台键盘 / 屏幕交互文件 IO 流与磁盘文件交互字符串流与内存中的字符串交互stringstream3.CIO 流C 的 IO 流是一套面向对象的类层次结构所有流类都继承自ios_base核心分支如下ios_base → ios → istream/ostream → iostream/ifstream/ofstream/stringstream1 .C 标准 IO 流控制台交互标准 IO 流是 C 预定义的全局流对象属于istream/ostream的实例。2.核心对象对象类型作用缓冲特性cinistream标准输入流键盘读取有缓冲coutostream标准输出流屏幕打印有缓冲cerrostream标准错误流错误信息打印无缓冲直接输出clogostream标准日志流日志信息打印有缓冲3.关键特性与用法运算符重载插入运算符输出和提取运算符输入是 CIO 流的核心支持链式调用且自动处理类型无需格式符int a 10; double b 3.14; string s hello; cout a a , b b , s s endl; // 自动适配类型流状态位流操作会维护 4 种状态位用于判断操作是否成功1.goodbit操作正常2.eofbit读取到文件 / 输入末尾3.failbit操作失败如类型不匹配4.badbit流发生严重错误如设备故障5.可通过cin.fail()/cin.clear()/cin.ignore()检查、重置状态或清空缓冲区。格式化控制通过iomanip头文件的函数控制输出格式cout fixed setprecision(2) 3.14159; // 保留2位小数输出3.14 cout setw(5) 10; // 设置输出宽度为5默认右对齐4.endl与\n的区别1.endl输出换行符 强制刷新缓冲区2.\n仅输出换行符不刷新缓冲区效率更高推荐优先使用5. 常见坑与解决方案cin s遇到空格会停止读取字符串需用getline(cin, s)读取整行。混合使用cin和getline时cin残留的换行符会被getline读取需用cin.ignore()清空缓冲区。谢谢