C++流之标准I/O流

来源:互联网 发布:惠伦模型 知乎 编辑:程序博客网 时间:2024/05/22 00:33

1、什么是标准I/O?

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

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


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

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

(1)无名枚举类

enum {skipws, left, right, internal, dec, oct, hex, showbase, showpoint, uppercase, showpos, scientific, fixed, unitbuf, stdio};

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

  • 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)文件打开模式枚举

enum open_mode {in, out, ate, app, trunc, nocreate, noreplace, binany};

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

(3)文件指针位置枚举

enum seek_dir {beg, cur, end};

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


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

int bad();    操作出错时返回非零值int eof();    读取到流中最后文件结束时返回非零值int fail();   操作失败时返回非零值void clear(); 清除bad、eof、fail所对应的标志状态,使之恢复为正常状态值0,使good标志状态恢复为1char fill();  返回当前使用的填充字节char fill(char c);    重新设置流中用于输出数据的填充字符为c的值,返回此前的填充字符。系统预设值填充字符为空格long flags(); 返回当前用于I/O控制的格式状态字long flags(long f);   重新设置格式状态字为f的值,返回此前的格式状态字int good();   操作正常时返回非零值,当操作出错、失败和读到文件结束符时均为不正常,则返回0int precision();      返回浮点数输出精度,即输出的有效数字的位数int precision(int n); 设置浮点数的输出精度为n,返回此前的输出精度,系统预设为6int 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中提供的控制标识符。使用它们可以不用调用成员函数,只需要把他们作为插入或提取运算法的运算对象即可。

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)    设置浮点数的输出精度为nsetw(int w)            设置下一个数据值的输出域宽为w

示例四:

#include <iostream>#include <iomanip>using namespace std;int main(){int x = 30, y = 300, z = 1024;cout << "default:" << x << ' ' << y << ' ' << z << endl;cout << "oct:" << oct << x << ' ' << y << ' ' << z << endl;cout << "hex:" << hex << x << ' ' << y << ' ' << z << endl;cout << hex << showbase << uppercase<< x << ' ' << y << ' ' << z << endl;return 0;}

结果和示例三一样

1 0
原创粉丝点击