码迷,mamicode.com
首页 > 编程语言 > 详细

C++流之标准I/O流

时间:2015-08-09 22:40:52      阅读:233      评论:0      收藏:0      [点我收藏+]

标签:c++流概念   标准io流   ios类   

1、什么是标准I/O?

标准I/O流是指对标准输入设备(键盘、鼠标等)和标准输出设备(显示器、打印机等)进行输入输出的过程。

2、标准I/O的类的继承关系是什么?

技术分享

3、ios类中几个常用的枚举类是什么?

在根基类ios类中定义了3个用户会经常使用的枚举类型,由于他们是在公用成员部分定义的,所以其中的每个枚举类型常量在加上ios::前缀后都可以为本类成员函数和所有外部函数访问。

(1)无名枚举类

<span style="font-size:14px;">enum {skipws, left, right, internal, dec, oct, hex, showbase, showpoint, uppercase, showpos, scientific, fixed, unitbuf, stdio};</span>

以下是上述枚举常量的简要说明:(注:我用易理解的白话说明,易于理解,但是可能存在片面性,请参照英文解释)

  • skipws    从第一个非空白(空格、‘\t‘、‘\r‘、‘\n‘)处开始输入    默认设置为“跳过”标志
  • left、right、internal     在制定的数据值显示区域宽度内按左(右)对齐显示输出,internal使数据值的符号按左对齐,数值本身按右对齐显示输出,同时只有一个有效。
  • dec、oct、hex    设置相应的标志后,使得后面的数值按照十进制、八进制和十六进制输出,默认设置为dex。
  • showbase    设置“基指示符”标志,即在数值输出的前面加上“基指示符”。对八进制是0,十六进制是0x,十进制默认没有,默认不设置,不添加基指示符
  • showpoint    强制输出浮点数中带有小数点和小数尾部的无效数字,默认不设置。
  • uppercase    是输出的十六进制数和浮点数中使用的字符为大写,默认不设置。
  • showpos    使输出的正数前带有正号“+”,默认不设置。
  • scientific、fixed    针对浮点数,设置scientific后使其按科学表示法输出,设置fixed后使其按定点表示法输出,两个只能设置一个,默认由系统根据数值定
  • unitbuf      每次输出操作之后刷新输出缓冲区
  • stdio    已经很少使用了,不作介绍

(2)文件打开模式枚举

<span style="font-size:14px;">enum open_mode {in, out, ate, app, trunc, nocreate, noreplace, binany};</span>

其中每一个枚举常量定义了一种文件打开的方式,将在后面的文件I/O流中作详细介绍。

(3)文件指针位置枚举

<span style="font-size:14px;">enum seek_dir {beg, cur, end};</span>

其中每一个枚举常量对应了一种文件指针的定位操作上,将在后面的文件I/O流中作详细介绍。


4、ios类中的成员函数有哪些?

int bad();    操作出错时返回非零值
int eof();    读取到流中最后文件结束时返回非零值
int fail();   操作失败时返回非零值
void clear(); 清除bad、eof、fail所对应的标志状态,使之恢复为正常状态值0,使good标志状态恢复为1
char fill();  返回当前使用的填充字节
char fill(char c);    重新设置流中用于输出数据的填充字符为c的值,返回此前的填充字符。系统预设值填充字符为空格
long flags(); 返回当前用于I/O控制的格式状态字
long flags(long f);   重新设置格式状态字为f的值,返回此前的格式状态字
int good();   操作正常时返回非零值,当操作出错、失败和读到文件结束符时均为不正常,则返回0
int precision();      返回浮点数输出精度,即输出的有效数字的位数
int precision(int n); 设置浮点数的输出精度为n,返回此前的输出精度,系统预设为6
int rdstate();操作正常时返回0,否则返回非0值,它与good()的返回值正好相反
int setf(long f);     根据参数f设置相应的格式化标志,返回此前的设置。其中参数f是之前提到无名枚举类型中的常量
int unsetf(long f);   根据参数f清楚相应的格式化标志,返回此前的设置。
int width();  返回当前的输出域宽
int width(int w);     设置下一个数据值的输出域宽为w,返回值为输出上一个数据值说规定的域宽。


以下就是用一个小例子对上面提到的成员函数作一个展示:

示例一:

#include <iostream>
using namespace std;
int main()
{
	int x = 30, y = 300, z = 1024;
	cout << "default:" << x << ' ' << y << ' ' << z << endl;
	
	cout.setf(ios::oct);
	cout << "oct:" << x << ' ' << y << ' ' << z << endl;

	return 0;
}
输出:

技术分享

我们会发现怎么设置了八进制格式没有效果呢?原因在于setf有两个重载版本。

第一个版本 fmtflags setf(fmtflags fmtfl);适用于boolalpha, showbase, showpoint, showpos, skipws, unitbuf和uppercase标志
第二个版本 fmtflags setf(fmtflags fmtfl, fmtflags mask);适用于left, right, internal, dec, oct, hex, scientific, fixed,并要指定掩码:adjustfield,basefield 或 floatfield

示例二:

#include <iostream>
using namespace std;
int main()
{
	int x = 30, y = 300, z = 1024;
	cout << "default:" << x << ' ' << y << ' ' << z << endl;
	
	cout.setf(ios::oct, ios::basefield);
	cout << "oct:" << x << ' ' << y << ' ' << z << endl;

	cout.setf(ios::hex);
	cout << "hex:" << x << ' ' << y << ' ' << z << endl;

	return 0;
}
输出:

技术分享

我们可以发现,通过添加ios::basefield解决了示例一的问题,但是发现好像第三次的输出并没有按照设置的十六进制进行输出。原因在于我们在设置新的输出方式之前,一定要使得其恢复默认设置,即要取消之前的设置,见示例三。

示例三:

#include <iostream>
using namespace std;
int main()
{
	int x = 30, y = 300, z = 1024;
	cout << "default:" << x << ' ' << y << ' ' << z << endl;
	
	cout.setf(ios::oct, ios::basefield);
	cout << "oct:" << x << ' ' << y << ' ' << z << endl;

	cout.unsetf(ios::oct); 
	cout.setf(ios::hex);
	cout << "hex:" << x << ' ' << y << ' ' << z << endl;

	cout.setf(ios::showbase | ios::uppercase);
	cout << x << ' ' << y << ' ' << z << endl;

	return 0;
}

输出:

技术分享

5、什么是格式控制符?

通过第四部分的介绍,我们可以利用ios类中的一些成员函数对输入输出的格式进行各种设置,但是每次使用时候都要先取消之前的设置,然后再重新设置,比较繁琐,有没有更加简洁的方式呢?答案当然是有的,那就是系统头文件iomanip中提供的控制标识符。使用它们可以不用调用成员函数,只需要把他们作为插入或提取运算法的运算对象即可。

<span style="font-size:14px;">dec    转换为十进制整数
oct    转换为八进制整数
hex    转换为十六进制整数
ws     从输入刘总一次读取所有连续的空白符
endl   输出换行符'\n'并刷新流
ends   输出一个控制符'\0'
flush  刷新一个输出流
setiosflags(long f)    设置f所对应的格式化标志
resetiosflags(long f)  清除f所对应的格式化标志
setfill(int c)         设置填充字符为ASCII码为c的字符
setprecision(int n)    设置浮点数的输出精度为n
setw(int w)            设置下一个数据值的输出域宽为w</span>

版权声明:本文为博主原创文章,未经博主允许不得转载。

C++流之标准I/O流

标签:c++流概念   标准io流   ios类   

原文地址:http://blog.csdn.net/dingyanxxx/article/details/47372687

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!