C++ Primer 5th笔记(chap 17 标准库特殊设施)流随机访问
1. 流类型通常都支持对流中数据的随机访问。
可以重定位流, 使之跳过一些数据, 首先读取最后一行, 然后读取第一行, 依此类推。
1.1 标准厍提供了一对函数, 来定位( seek )到流中给定的位置, 以及告诉( tell) 我们当前位置
- seek函数:将标记 seek 到一个给定位置来重定位它;
- tell 函数:tell 我们标记的当前位置。
标准库实际上定义了两对 seek 和 tell 函数:
- g 版本表示我们正在“ 获得”( 读取) 数据
- p 版本表示我们正在“ 放置”( 写入) 数据
只适用于fstream和sstream。
操作 | 解释 |
---|---|
tellg() | tellp 返回一个输入流中(tellg)或输出流中(tellp)标记的当前位置。 |
seekg(pos) | seekp(pos) 在一个输入流或输出流中将标记重定位到给定的绝对地址。pos通常是一个当前teelg或tellp返回的值。 |
seekp(off, from) seekg(off, from) | 在一个输入流或输出流中将标记定位到from之前或之后off个字符,from可以是下列值之一:beg,偏移量相对于流开始位置;cur,偏移量相对于流当前位置;end,偏移量相对于流结尾位置。 |
1.2 只有一个标记
标准库区分 seek 和 tell 函数的“ 放置” 和“ 获得” 版本这一特性可能会导致误解。
即使标准库进行了区分, 但它在一个流中只维护单一的标记—并不存在独立的读标记和写标记
由于只有单一的标记, 因此只要我们在读写操作间切换, 就必须进行 seek 操作来重1定位标记。 .
1.3 重定位标记
seek 函数有两个版本: 一个移动到文件中的“ 绝对” 地址: 另一个移动到一个给定位置的指定偏移量:
//将标记移动到一个固定位置
seekg (new_position); / / 将读标记移动到指定的 pos_type 类型的位置
seekp (new_position); / / 将写标记移动到指定的 pos_type 类型的位置
/ / 移动到给定起始点之前或之后指定的偏移位置
seekg (offset, from); / / 将读标记移动到距 from 偏移量为 offset 的位置
seekp (offset, from); / / 将写标记移动到距 from 偏移量为 of fset 的位置
- pos_type表示一个文件位置
- off_type 表示距当前位置的一个偏移量。
一个 off_type 类型的值可以是正的也可以是负品, 即可以在文件中向前移动或向后移动。
1.4 访问标记
函数 tellg 和 tellp 返回一个pos_type表示流的当前位置。tell 函数通常用来记住一个位置, 以便稍后再定位回来
ostringstream::writeStr;// 输出 stringstream
ostringstream::pos_type mark = writeStr.tellp ( );
// ...
if (cancelEntry)
/ / 回到刚才记住的位置
writeStr.seekp (mark);/ / 以读写方式打开文件, 并定位到文件尾
fstream inOut("test_2.txt", fstream::ate|fstream::in|fstream::out);if(!inOut){return EXIT_FAILURE;}/ / inOut 以 ate 模式打开, 因此一开始就定义到其文件尾auto end_mark = inOut.tellg();//记住原文件尾位置inOut.seekg(0,fstream::beg);/ / 重定位到文件开始size_t cnt = 0;/ / 字节数累加器string line;/ / 保存输入中的每行while(inOut&&inOut.tellg() != end_mark&&getline(inOut,line)){/ / 继续读取的条件: 还未遇到错误且还在读取原数据/ / 且还可获取一行输入cnt += line.size()+1;/ / 加 1表示换行符cout << line.size() << endl;auto mark = inOut.tellg();/ / 记住读取位置inOut.seekp(0,fstream::end);II 将写标记移动到文件尾inOut << cnt;/ / 输出累计的长度
/ / 如果不是最后一行, 打印一个分隔符if(mark != end_mark)inOut << " ";inOut.seekg(mark);/ / 恢复读位置}inOut.seekp(0,fstream::end);
原始文件:
abed
efg
hi
j
修改过的文件:
abed
efg
hi
j5
9 12 14
C++ Primer 5th笔记(chap 17 标准库特殊设施)流随机访问相关推荐
- C++ Primer 5th笔记(chap 17 标准库特殊设施)多字节低层IO操作
1. 多字节操作 一些未格式化 IO 操作一次处理大块数据,这些操作要求我们自己分配并管理用来保存和提取数据的字符数组 操作 解释 is.get(sink, size, delim) 从is中读取最多 ...
- C++ Primer 5th笔记(chap 17 标准库特殊设施)未格式化的输入/输出操作
1. 格式化IO 输入和输出运算符(<< 和>>)根据读取或写入的数据类型来格式化它们. 输入运算符忽略空白符 输出应用补白 精度等规则操作 2. 未格式化 IO (unfor ...
- C++ Primer 5th笔记(chap 17 标准库特殊设施)IO库 之操纵符
1. 控制浮点数格式 可以控制浮点数输出三个种格式 • 以多高精度( 多少个数字) 打印浮点值 • 数值是打印为十六进制. 定点十进制还是科学记数法形式 • 对于没有小数部分的浮点值是否打印小数点 1 ...
- C++ Primer 5th笔记(chap 17 标准库特殊设施)匹配标志
1. 用来控制匹配和格式的标志 标准库还定义了用来在替换过程中控制匹配或格式的标志,这些标志可以传递给函数 regex_search 或 regex_match 或是类 smatch 的 format ...
- C++ Primer 5th笔记(chap 17 标准库特殊设施)正则表达式类和输入序列类型
1. 多种类型的输入 可以搜索多种类型的输入序列. RE 库为这些不同的输入序列类型都定义了对应的类型,eg. 普通 char 数据.wchar_t 数据 字符可以保存在标准库string或是 cha ...
- C++ Primer 5th笔记(chap 17 标准库特殊设施)正则表达式错误
1. 指定或使用正则表达式时的错误 如果我们编写的正则表达式存在错误, 则在运行时标准库会抛出一个类型为regex 的异常 eg. try {// alnum右括号少了一个, 构造函数会抛出异常reg ...
- C++ Primer 5th笔记(chap 17 标准库特殊设施)bitset类型
1. 提取 bitset 的值 函数返回一个值,保存了与bitset 对象相同的位模式. to_ulong() // 返回unsigned long to_ullong() //返回unsigned ...
- C++ Primer 5th笔记(chap 17 标准库特殊设施)随机数
1. 场景: rand 生成随机数 此函数生成均匀分布的伪随机整数, 每个随机数的范围在 0 和一个系统相关的最大值( 至少为 32767) 之间. 1.1 问题: 一些应用需要随机浮点数. 一些程序 ...
- C++ Primer 5th笔记(chap 17 标准库特殊设施)tuple 类型
1. 定义 将一些数据组合成单一对象(类似pair) tuple支持的操作 操作 解释 tuple<T1, T2, -, Tn> t; t是一个tuple,成员数为n,第i个成员的类型是T ...
最新文章
- C#三种判断数据库中取出的字段值是否为空(NULL) 的方法
- 实例告诉你如何把 if-else 重构成高质量代码!
- python怎么下载-如何下载python包
- openjdk-alpine镜像字体问题
- 【学习笔记】springboot的过滤器与拦截器的使用 springboot的事件驱动模型
- 算法有偏见?总比人类识别强吧!
- 携程在港挂牌:两次疫情两次上市 穿越周期初心不灭
- 安装apache 后,找不到服务,解决办法
- Illustrator 教程,如何在 Illustrator 中创建线条?
- 第5章分布式系统模式 Broker(代理程序)
- excel mysql 财务_excel函数 数据库 财务函数 统计函数 信息函数
- spring boot actuator和K8s容器健康检查
- BIO、NIO、AIO网络编程
- 深度操作系统deepin下载与安装教程-系统安装
- NEON码农指导 Chapter 4 : NEON Intrinsics
- 乌班图好玩的命令_Ubuntu实用命令大全
- 图灵的文章“Computing machinery and intelligence”译文
- SlidesJS基本使用方法
- MySQL之数据库基字符集,中文乱码,大小写敏感,Packet for query is too large
- java机试题---2021(算法)
热门文章
- 操作系统:进程间通信与线程间同步
- 6.OSI七层网络模型与TCP/IP四层网络模型
- 【Scratch】青少年蓝桥杯_每日一题_6.09_密码
- 数据仓库—stg层_数据仓库之Hive快速入门 - 离线实时数仓架构
- 第001期:数据中心知识问答
- dcdc模块降额设计_模块电源应用设计的可靠性和注意事项
- 计算机上检查视力表,视力检测(30cm视力表自测)
- linux 网卡丢弃多播包,rp_filter及Linux下多网卡接收多播的问题
- Computer:成功解决安装软件时需要系统空间环境辅助程序(比如Microsoft Visual C++2010 x86 Redistributable安装失败)
- 成功解决schedule.ScheduleValueError: Invalid time format