IO操纵符是一种辅助控制输入输出流方法。操纵符对象可以分为两类,一个是带参数的(std::setw(10)
),另外一个是不带参数的(set::hex
)。
下面这些操作是定义在中的:
一些定义在中的:
一些定义在ostream
中的:
\0
flush输出后立即刷新endl输出后回车并刷新emit_on_flushnoemit_on_flush(C++20)controls whether a stream’s basic_syncbuf emits on flushflush_emit (C++20)flushes a stream and emits the content if it is using a basic_syncbuf
定义在中的:
要提一下,quoted这个操纵符,是用来格式化输入/输出的。其定义如下:
template
/*unspecified*/ quoted(const CharT* s,
CharT delim=CharT('"'), CharT escape=CharT('\\'));(1) (since C++14)
template
/*unspecified*/ quoted(const std::basic_string& s,
CharT delim=CharT('"'), CharT escape=CharT('\\'));(2) (since C++14)
template
/*unspecified*/ quoted(std::basic_string_view s,
CharT delim=CharT('"'), CharT escape=CharT('\\'));(3) (since C++17)
template
/*unspecified*/ quoted(std::basic_string& s,
CharT delim=CharT('"'), CharT escape=CharT('\\'));(4)
这个操作将会做以下事情:
- 添加delim符号到字符串两端
- 添加escape符号到转义字符,以保留符号
一般而言,我们应该优先考虑格式化IO,这不容易出错。有时候不得不这么做的时候,标准库也提供了将一个流看做一个无解释的字节序列的底层操作。
2.1 单字节操作 操作含义is.get(ch)从istream读取下一个字节到字符ch中os.put(ch)将字符ch输出至ostream中is.get()istream下一个字节作为int返回is.putback(ch)将字符ch放回istream。返回istreamis.unget()将istream向后移动一个字节,返回istreamis.peek()下一个字节作为int返回而不从流删除它为什么这些函数不直接返回类型为char的字符类型?这是因为要支持文件尾标志(EOF,定义在cstdio中const),表示已经读到了流的末尾。
ASCII码是非负的,将没有的多余的数用来表示EOF,标准库的做法是,将char首先转换成unsigned char然后提升至int,这样一来,我们就将负数看作是文件尾部了。
简单来说,你可以从流中读取一个字节数据,然后推动流移动(get),也可以推动之后再放回 (putback),也可看读取不推动(peek),也已可以,只推动不读取。
2.2 多字节操作 操作含义is.get(sink,size,delim)从起始地址为sink的字符数组中读取之多size个字符。以下情况停止,文件尾部、delim字符(delim放回流中),或者指定size字符is.getline(sink,size,delim)同上,不过会丢弃delimis.read(sink,size)读取最多size个字节,存入sink中。返回isis.gcount()返回已经从is读取的字节数os.write(source,size)将source中的size字节写入os输出流is.ignore(size=1,delim=EOF)读取并忽略最多size个字符,包括delim 三、流随机访问我们可以通过随机访问,跳过一行,一些字节,也可以定位seek,告诉tell当前位置。标准库为所有的流设备都定义了seek和tell函数,具体有没有意义取决于系统设备。一般而言,cin cout cerr和clog不支持流随机访问,你这么做流将会处于错误状态。下面的讨论都是在fstream和sstream的。
操作含义tellg()tellp()输入流(tellg)和输出流(tellp)中当前标记位置seekg(pos)seekp(pos)输入流(seekg)和输出流(seekp)定位到绝对位置,一般是上一个操作的返回值seeko(off,from)seekg(off,from)定位到from后off字节位置,from可以是 beg cur 和end 二、例子#include
#include
#include
enum class cap { title, middle, end };
void print(const char* text, double num, cap c)
{
if (c == cap::title) std::cout
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?