在C++语言中,数据的输入和输出(简写为I/O)包括对标准输入设备键盘和标准输出设备显示器、对在外存磁盘上的文件和对内存中指定的字符串存储空间(当然可用该空间存储任何信息)进行输入输出这三个方面。对标准输入设备和标准输出设备的输入输出简称为标准I/O,对在外存磁盘上文件的输入输出简称为文件I/O,对内存中指定的字符串存储空间的输入输出简称为串I/O。 输入输出格式控制 另外提供一个新的编写c/c++程序的方法,因为在vs下面编写一个简单的小程序,就得生成一大串中间文件,令人十分的不爽 (1),下载utraledit-32编辑器,推荐v11.
1.ios类中的枚举常量 在根基类ios中定义有三个用户需要使用的枚举类型,由于它们是在公用成员部分定义的,所以其中的每个枚举类型常量在加上ios::前缀后都可以为本类成员函数和所有外部函数访问。在三个枚举类型中有一个无名枚举类型,其中定义的每个枚举常量都是用于设置控制输入输出格式的标志使用的。该枚举类型定义如下: enum {skipws, left, right, internal, dec, oct, hex, showbase, showpoint, uppercase, showpos, scientific, fixed, unitbuf, stdio }; 各枚举常量的含义如下: skipws 利用它设置对应标志后,从流中输入数据时跳过当前位置及后面的所有连续的空白字符,从第一个非空白字符起读数,否则不跳过空白字符。空格、制表符'/t'、回车符'/r'和换行符'/n'统称为空白符。缺省为设置。 left, right, internal left在指定的域宽内按左对齐输出,right按右对齐输出,而internal使数值的符号按左对齐、数值本身按右对齐输出。域宽内剩余的字符位置用填充符填充。缺省为right设置。在任一时刻只有一种有效。 dec, oct, hex 设置dec对应标志后,使以后的数值按十进制输出,设置oct后按八进制输出,而设置hex后则按十六进制输出。缺省为dec设置。 showbase 设置对应标志后使数值输出的前面加上"基指示符",八进制数的基指示符为数字0,十六进制数的基指示符为0x,十进制数没有基指示符。缺省为不设置,即在数值输出的前面不加基指示符。 showpoint 强制输出的浮点数中带有小数点和小数尾部的无效数字0。缺省为不设置。 uppercase 使输出的十六进制数和浮点数中使用的字母为大写。缺省为不设置。即输出的十六进制数和浮点数中使用的字母为小写。 showpos 使输出的正数前带有正号"+"。缺省为不设置。即输出的正数前不带任何符号。 scientific, fixed 进行scientific设置后使浮点数按科学表示法输出,进行fixed设置后使浮点数按定点表示法输出。只能任设其一。缺省时由系统根据输出的数值选用合适的表示输出。 unitbuf, stdio 这两个常量很少使用,所以不予介绍。 在ios中定义的第二个枚举类型为: enum open_mode {in, out, ate, app, trunc, nocreate, noreplace, binany}; 其中的每个枚举常量规定一种文件打开的方式,在定义文件流对象和打开文件时使用。 在ios中定义的第三个枚举类型为: enum seek_dir {beg, cur, end}; 其中的每个枚举常量用于对文件指针的定位操作上。 2. ios类中的成员函数 ios类提供成员函数对流的状态进行检测和进行输入输出格式控制等操作,每个成员函数的声明格式和简要说明如下: int bad(); //操作出错时返回非0值。 int eof(); //读取到流中最后的文件结束符时返回非0值。 int fail(); //操作失败时返回非0值。 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值,当操作出错、失败和读到文件结束符时 //均为不正常,则返回0。 int precision(); //返回浮点数输出精度,即输出的有效数字的位数。 int precision(int n); //设置浮点数的输出精度为n,返回此前的输出精度。 //系统预设置的输出精度为6,即输出的浮点数最多 //具有6位为有效数字。 int rdstate(); //操作正常时返回0,否则返回非0值,它与good()正好相反。 long setf(long f); //根据参数f设置相应的格式化标志,返回此前的设置。 //该参数f所对应的实参为无名枚举类型中的枚举常量( //又称格式化常量),可以同时使用一个或多个常量,每两个 //常量之间要用按位或操作符连接。如当需要左对齐输出, //并使数值中的字母大写时,则调用该函数的实参为ios:: //left | ios::uppercase。 long unsetf(long f); //根据参数f清除相应的格式化标志,返回此前的设置。 //如要清除此前的左对齐输出设置,恢复缺省的右对齐输出 //设置,则调用该函数的实参为ios::left。 int width(); //返回当前的输出域宽。若返回数值0则表明没有为刚才输出的 //数值设置输出域宽,输出域宽是指输出的值在流中所占有的字节数。 int width(int w); //设置下一个数据值的输出域宽为w,返回为输出上一个数 //据值所规定的域宽,若无规定则返回0。注意:此设置不 //是一直有效,而只是对下一个输出数据有效。 因为所有I/O流类都是ios的派生类,所以它们的对象都可以调用ios类中的成员函数和使用ios类中的格式化常量进行输入输出格式控制。下面以标准输出流对象cout为例说明输出的格式化控制。 程序1: #include<iostream.h> void main() { int x=30, y=300, z=1024; cout<<x<<' '<<y<<' '<<z<<endl; //按十进制输出 cout.setf(ios::oct); //设置为八进制输出 cout<<x<<' '<<y<<' '<<z<<endl; //按八进制输出 cout.unsetf(ios::oct); //取消八进制输出设置,恢复按十进制输出 cout.setf(ios::hex); //设置为十六进制输出 cout<<x<<' '<<y<<' '<<z<<endl; //按十六进制输出 cout.setf(ios::showbase | ios::uppercase); //设置基指示符输出和数值中的字母大写输出 cout<<x<<' '<<y<<' '<<z<<endl; cout.unsetf(ios::showbase | ios::uppercase); //取消基指示符输出和数值中的字母大写输出 cout<<x<<' '<<y<<' '<<z<<endl; cout.unsetf(ios::hex); //取消十六进制输出设置,恢复按十进制输出 cout<<x<<' '<<y<<' '<<z<<endl; } 此程序的运行结果如下: 30 300 1024 36 454 2000 1e 12c 400 0X1E 0X12C 0X400 1e 12c 400 30 300 1024 程序2: #include<iostream.h> void main() { int x=468; double y=-3.425648; cout<<"x="; cout.width(10); //设置输出下一个数据的域宽为10 cout<<x; //按缺省的右对齐输出,剩余位置填充空格字符 cout<<"y="; cout.width(10); //设置输出下一个数据的域宽为10 cout<<y<<endl; cout.setf(ios::left); //设置按左对齐输出 cout<<"x="; cout.width(10); cout<<x; cout<<"y="; cout.width(10); cout<<y<<endl; cout.fill('*'); //设置填充字符为'*' cout.precision(3); //设置浮点数输出精度为3 cout.setf(ios::showpos); //设置正数的正号输出 cout<<"x="; cout.width(10); cout<<x; cout<<"y="; cout.width(10); cout<<y<<endl; } 此程序运行结果如下: x= 468y= -3.42565 x=468 y=-3.42565 x=+468******y=-3.43***** 程序3: #include<iostream.h> void main() { float x=25, y=-4.762; cout<<x<<' '<<y<<endl; cout.setf(ios::showpoint); //强制显示小数点和无效0 cout<<x<<' '<<y<<endl; cout.unsetf(ios::showpoint); //恢复缺省输出 cout.setf(ios::scientific); //设置按科学表示法输出 cout<<x<<' '<<y<<endl; cout.setf(ios::fixed); //设置按定点表示法输出 cout<<x<<' '<<y<<endl; } 程序运行结果如下: 25 -4.762 25.0000 -4.76200 2.500000e+001 -4.762000e+000 25 -4.762 3. 格式控制操作符 数据输入输出的格式控制还有更简便的形式,就是使用系统头文件iomanip.h中提供的操纵符。使用这些操纵符不需要调用成员函数,只要把它们作为插入操作符<<(个别作为提取操作符>>)的输出对象即可。这些操纵符及功能如下: dec //转换为按十进制输出整数,它也是系统预置的进制。 oct //转换为按八进制输出整数。 hex //转换为按十六进制输出整数。 ws //从输入流中读取空白字符。 endl //输出换行符'/n'并刷新流。刷新流是指把流缓冲区的内容立即写入到对 //应的物理设备上。 ends //输出一个空字符'/0'。 flush //只刷新一个输出流。 setiosflags(long f) //设置f所对应的格式化标志,功能与setf(long f) //成员函数相同,当然输出该操纵符后返回的是一个 //输出流。如采用标准输出流cout输出它时,则返回 //cout。对于输出每个操纵符后也都是如此,即返回 //输出它的流,以便向流中继续插入下一个数据。 resetiosflags(long f) //清除f所对应的格式化标志,功能与unsetf(long f) //成员函数相同。当然输出后返回一个流。 setfill(int c) //设置填充字符为ASCII码为c的字符。 setprecision(int n) //设置浮点数的输出精度为n。 setw(int w) //设置下一个数据的输出域宽为w。 在上面的操纵符中,dec, oce, hex, endl, ends, flush和ws除了在iomanip.h中有定义外,在iostream.h中也有定义。所以当程序或编译单元中只需要使用这些不带参数的操纵符时,可以只包含iostream.h文件,而不需要包含iomanip.h文件。 下面以标准输出流对象cout为例,说明使用操作符进行的输出格式化控制。 程序4: #include<iostream.h> //因iomanip.h中包含有iostream.h,所以该命令可省略 #include<iomanip.h> void main() { int x=30, y=300, z=1024; cout<<x<<' '<<y<<' '<<z<<endl; //按十进制输出 cout<<oct<<x<<' '<<y<<' '<<z<<endl; //按八进制输出 cout<<hex<<x<<' '<<y<<' '<<z<<endl; //按十六进制输出 cout<<setiosflags(ios::showbase | ios::uppercase); //设置基指示符和数值中的字母大写输出 cout<<x<<' '<<y<<' '<<z<<endl; //仍按十六进制输出 cout<<resetiosflags(ios::showbase | ios::uppercase); //取消基指示符和数值中的字母大写输出 cout<<x<<' '<<y<<' '<<z<<endl; //仍按十六进制输出 cout<<dec<<x<<' '<<y<<' '<<z<<endl; //按十进制输出 } 此程序的功能和运行结果都与程序1完全相同。 程序5: #include<iostream.h> #include<iomanip.h> void main() { int x=468; double y=-3.425648; cout<<"x="<<setw(10)<<x; cout<<"y="<<setw(10)<<y<<endl; cout<<setiosflags(ios::left); //设置按左对齐输出 cout<<"x="<<setw(10)<<x; cout<<"y="<<setw(10)<<y<<endl; cout<<setfill('*'); //设置填充字符为'*' cout<<setprecision(3); //设置浮点数输出精度为3 cout<<setiosflags(ios::showpos); //设置正数的正号输出 cout<<"x="<<setw(10)<<x; cout<<"y="<<setw(10)<<y<<endl; cout<<resetiosflags(ios::left | ios::showpos); cout<<setfill(' '); } 此程序的功能和运行结果完全与程序2相同。 程序6: #include<iomanip.h> void main() { float x=25, y=-4.762; cout<<x<<' '<<y<<endl; cout<<setiosflags(ios::showpoint); cout<<x<<' '<<y<<endl; cout<<resetiosflags(ios::showpoint); cout<<setiosflags(ios::scientific); cout<<x<<' '<<y<<endl; cout<<setiosflags(ios::fixed); cout<<x<<' '<<y<<endl; } 此程序的功能和运行结果也完全与程序3相同。 |
|