C++中的IO库(五)

时间:2014.03.22

地点:基地

---------------------------------------------------------------------

一、指定浮点数计数法

  最佳实践:除非你需要控制浮点数的表示形式,比如按列打印数据或打印表示金额或百分比的数据),否则由标准库选择计数法是最好的方式。

  同样的道理,通过使用操纵符可以控制流使用科学计数法、定点十进制或十六进制计数。这些操纵符总结如下:

  scientific 改变流的状态使用科学计数法

  fixed         改变流的状态使用定点十进制

  hexfloat  强制浮点数使用十六进制格式

  defaultfloat 将流恢复到默认状态(根据要打印的值选择计数法)

---------------------------------------------------------------------

二、打印小数点

  默认情况当浮点值得小数部分为0时不显示小数点,showpoint操纵符强制打印小数点;noshowpoint则恢复默认行为。比如:

cout<<showpoint<<10.0
    <<noshowpoint<<endl;

---------------------------------------------------------------------

三、输出补白

  setw  指定下一个数字或字符串值得最小空间,例:setw(12) 将在输出中至少流出12个位置供下一个输出占据

  left  左对齐输出

  right 右对齐输出,默认格式

  interal  控制负数的符号的位置,左边符号对齐,右对值对齐,用空格填满所有中间空间

  setfii  允许指定一个字符代替默认的空格来补白输出。例:setfill('#')

下面在来总结下定义在头文件iomanip中的操纵符,有:

setfill(ch)                            用字符ch填充空白

setprecision(n)                 将浮点精度设置为n

setw(w)                              读或者写值得宽度为w个字符

setbase(b)                         将整数输出为b进制

---------------------------------------------------------------------

四、控制输入格式

  默认情况下,输入运算符会忽略空白符(空格符、制表符、换行符、回车符)而操纵符noskipws则会令输入运算符读取空白符而不是跳过,恢复默认行为则再使用skipws操纵符,比如:

char ch;
while(cin>>ch){
    cout<<ch;
输入:

a b d

d

循环执行 4次

cin>>noshipws;  //现在设置cin读取空白符
while(cin>>ch)
  cout<<ch;
cin>>skipws;  //将cin恢复到默认状态,丢弃空白符

和前一样用相同的输入时,循环会执行7次(4个普通字符,一个空格字符,一个制表符,一个回车符)

---------------------------------------------------------------------

 五、未格式化的输入/输出操作

  未格式化IO操作运允许我们将一个流当做一个无解释的字节序列来处理。比如我们可以使用未格式化IO操作get和put来读取和写入一个字符:

char ch;
while(cin.get(ch))
  cout.put(ch);
这种未格式化的IO操作执行于底层操作之上,不会忽略任何字符。单字节底层IO操作总结如下:

is.get(ch)           从istream is流中读取下一个字节存入字符ch中,返回is流

os.put(ch)          将字符ch输出到ostream os,返回os流

is.get()                 将is流的下一个字节作为int返回

is.putback(ch)   将字符ch放回is流中,返回is

is.unget()             将is向后移动一个字节,返回is流

is.peek()              将下一个字节作为int返回,但不从流中删除它

---------------------------------------------------------------------

六、将字符放回输入流

  有三种方法:

1.peek方法返回输入流中下一个字符的副本,但不会将它从流中删除,peek返回的值仍然在流中

2.unget使得输入流向后移动一个字节

3.putback退回从流中读取的最后一个值,接受一个参数,但此参数必须与最后读取的值相同

---------------------------------------------------------------------

七、从输入操作返回的int值

  函数peek和无参的get都以int类型从输入流返回一个字符。但为何不用char显得更自然呢,原因是:返回int可以返回文件尾标记,char范围中的每个值表示一个真实字符,因此范围中没有额外的值可用来表示文件尾。返回int的函数先将返回的字符转换为unsigned char,然后在将结果提升到int。因此即使字符集中友字符映射到负值,这些操作返回的int也是正值。而标准库使用负值表示文件尾,这样就可以保证与任何合法字符的值都不同。头文件cstdio定义了一个名为EOF的const,可用来检测从get返回的值是否是文件尾,而不必记忆表示文件尾的实际数值。

int ch;  //使用一个int而不是一个char来保存get()的返回值
while( (ch=cin.get() )!=EOF)
  cout.put(ch);

---------------------------------------------------------------------

八、多字节操作

  如果速度是考虑的重点,那么使用未格式化IO操作一次处理大块数据是很有必要的。总结如下:

is.get(sink,size,delim)

  从is流中最多读取size个字节,并保存在字符数组中,字符数组的起始地址由sink给出,读取过程直至遇到字符delim或读取了size个字节或遇到文件尾时停止。如果遇到的是delim,则将其留在输入流中,不读取出来存入sink中。

is.getline(sink,size,delim);           //和上述get类似
is.read(sink,size);                //读取最多size个字节,存入字符数组sink中,返回is流
is.gcount();               //返回上一个未格式化读取操作从is读取的字节数
os.write(source,size);     //将字符数组source中的size个字节写入os,返回os
is.ignore(size,delim);     //读取并忽略最多size个字符,包括delim,与其他未格式化函数不同,ignore有默认参数,size默认值为1,delim的默认值为文件尾。
get和getline有类似的行为,差别在于get将分隔符留作istream中的下一个字符,而getline则读取并丢弃分隔符。无论哪个函数都不会将分隔符保存在sink中。

---------------------------------------------------------------------

九、确定读取了多少个字符

  某些操作从输入读取未知个数的字节,可以调用gcount来确定最后一个未格式化输入操作读取了多少个字符。将字符退回流的单字符操作也属于未格式化输入操作。如果在调用gcout之前调用了peek、unget或putback,则gcount的返回值为0 。



  




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值