您当前的位置: 首页 > 

我什么都布吉岛

暂无认证

  • 1浏览

    0关注

    292博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

标准库(二)输入输出库Manipulators

我什么都布吉岛 发布时间:2021-11-29 15:39:37 ,浏览量:1

IO操纵符是一种辅助控制输入输出流方法。操纵符对象可以分为两类,一个是带参数的(std::setw(10)),另外一个是不带参数的(set::hex)。

一、格式化IO

下面这些操作是定义在中的:

操作含义boolalphanoboolalpha布尔型显示类型(默认是0 1)showbasenoshowbase是否显示进制(默认不显示)showpointnoshowpoint小数部分为空是否显示小数点(默认不显示)showposnoshowpos非负数是否显示+号(默认不显示)skipwsnoskipws前导空白符是否略过(默认略过)uppercasenouppercase是否使用大写的符号(默认不使用)unitbufnounitbuf是否立即刷新缓冲区(默认不,对输出流无效)internalleftright填充位置选择,选择负数的符号位置dechexoct进制打印选择fixedscientifichexfloatdefaultfloat浮点型打印方法,固定位数,科学计数、和默认浮点型

一些定义在中的:

操作含义ws忽略导前空白字符

一些定义在ostream中的:

操作含义ends输出后加上额外的\0flush输出后立即刷新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

定义在中的:

操作含义resetiosflags清空特定的ios_base标志setiosflags设置特定的ios_base标志setbase改变进制setfill修改填充符号setprecision设置浮点型精度位数setw改变下一个输入输出的占位宽度get_money解析一个货币值put_money格式化并输出一个货币值get_time解析特定日期/时间值put_time格式化并输出特定日期/时间值quoted(C++14)插入并提取一个用引号字符串

要提一下,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

一般而言,我们应该优先考虑格式化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             
关注
打赏
1658157489
查看更多评论
0.0360s