标准I/O流是指对标准输入设备(键盘、鼠标等)和标准输出设备(显示器、打印机等)进行输入输出的过程。
在根基类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流中作详细介绍。
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; }输出:
通过第四部分的介绍,我们可以利用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>
版权声明:本文为博主原创文章,未经博主允许不得转载。
原文地址:http://blog.csdn.net/dingyanxxx/article/details/47372687