C++格式化输出

(1)什么是“流”?

        C++中的“流”(stream)是一种抽象,它表示数据从源端流向目的端。
        输入流(Input Stream)表示的是数据从输入设备(如键盘、磁盘等)流向内存,输出流(Output Stream)表示的是数据从内存流向输出设备(如屏幕、打印机、磁盘等)。输入输出流(I/O Stream)是输入流和输出流的合称。“流”中的内容可以是任意形式的数据,例如:ASCII字符、二进制形式的数据、图形、图像、声音等信息。

(2)C++将输入输出流(简称I/O流)分成三种类型:
        标准输入输出流:流向标准输入输出设备(即键盘、显示器)的数据;
        文件输入输出流:流向外存磁盘文件的数据;
        字符串输入输出流:对内存中指定的空间(通常用一个字符数组作为存储空间)进行输入输出操作,流向这里的数据。

(3)输入输出的类、类库
       流类:在C++中定义的实现I/O的类;
       流库:多个流类及其类层次集合;
       C++中的流类由两类平行基类ios和streambuf组成,所有流类都通过这两个基类派生出来。
       ios类是所有ios类层次的基类,提供输入/输出所需要的公共操作。

(1)输出流对象
       cout:输出基本类型数据时,不必考虑数据是什么类型,系统会自动判断,选择相应的重载函数;输出用户自己定义的类型数据时,要重载<<运算符(具体见第8讲内容);
       cerr:是在屏幕上显示出错信息,与cout用法类似,不同的是只能在屏幕上,而不能在磁盘文件上输出错误信息;
       clog:用法与cerr类似,不同点是它带有缓冲区。

(2)格式输出
      1)用格式控制符控制输出
                 输出不同进制的数:dec(十进制)、hex(十六进制)、oct(八进制)

                           例:
                                                int n=20;
                                                cout<<"设置进制: "<<endl;
                                                cout<<"十进制: "<<n<<endl;
                                                cout<<"十六进制: "<<hex<<n<<endl;
                                                cout<<"八进制: "<<oct<<n<<endl;
                                                cout<<"十进制: "<<dec<<n<<endl;

               设置域宽:setw(n), n小于实际宽度时,按实际宽度输出,它一次只控制一个数值输出。

                           例:
                                                int m=1234;
                                                cout<<"设置域宽: "<<endl;
                                                cout<<setw(3)<<m<<endl;
                                                cout<<setw(5)<<m<<endl;
                                                cout<<setw(10)<<m<<endl;

              设置填充字符:setfill(c),需要与setw(n)合用

                          例:
                                                int m=1234;
                                                cout<<"设置填充字符: "<<endl;
                                                cout<<setfill(‘*’)<<setw(5)<<m<<endl;
                                                cout<<setw(10)<<m<<endl;
              设置对齐方式:setiosflags(ios::left)(左对齐)、setiosflags(ios::right)(右对齐)
                                                int m=1234;
                                                cout<<"设置对齐方式"<<endl;
                                                cout<<setfill(' ');
                                                cout<<setiosflags(ios::left)<<setw(10)<<m<<endl;
                                                cout<<setiosflags(ios::right)<<setw(10)<<m<<endl;

               强制显示小数点和尾0:setiosflags(ios::showpoint)
               强制显示符号:setiosflags(ios::showpos)

                                                double d1=10/5,d2=22.0/7;
                                                cout<<"显示小数点、尾和数符: "<<endl;
                                                cout<<d1<<endl;
                                                cout<<setiosflags(ios::showpoint)<<d1<<endl;
                                                cout<<setiosflags(ios::showpos)<<d2<<endl;
                                                cout<<resetiosflags(ios::showpos);

              设置浮点数的输出是以科学记数法还是定点数
                                                setiosflags(ios::scientific)(科学记数法)
                                                setiosflags(ios::fixed)(定点数)

                                                double dd=123.4567;
                                                cout<<setiosflags(ios::scientific)<<dd<<endl;
                                                cout<<setiosflags(ios::fixed)<<dd<<endl;

              设置精度(有效数字):setprecision(n)自动四舍五入

                                                double dd=123.4567;
                                                cout<<setprecision(2)<<dd<<endl;
                                                cout<<setprecision(3)<<dd<<endl;
                                                cout<<setprecision(4)<<dd<<endl;
                                                cout<<setprecision(5)<<dd<<endl;

              输出十六进制数时控制英文字母的大小写:setiosflags(ios::uppercase)

                                                int num=510;
                                                cout<<"以大小写方式输出进制数: "<<endl;
                                                cout<<"16进制数(默认:小写方式):"<<hex<<num<<endl;
                                                cout<<"以大写方式输出进制数: "<<setiosflags(ios::uppercase)<<hex<<num<<endl;
                                                cout<<"恢复小写方式输出进制数: "<<resetiosflags(ios::uppercase)<<hex<<num<<endl;

                                    程序运行结果:
                                                以大小写方式输出进制数:
                                                                                            16进制数(默认:小写方式):1fe
                                                                                             以大写方式输出进制数:1FE
                                                                                             恢复小写方式输出进制数: 1fe

(3) 用流成员函数put()输出字符
        格式: put(字符型)
        功能:输出单一个字符

        //例13-2 用流成员函数put()反序输出一个字符串
                         #include <iostream>
                         using namespace std;
                         void main()
                         {
                                       char str[]="Programming with C++";
                                       for( int i=sizeof(str)/sizeof(str[0])-2 ; i>=0; i--)
                                                 cout.put(*(str+i));
                                       cout.put('\n');
                        }

        在C++中,默认的标准输入设备是键盘,在iostream文件中定义了cin输入流对象。
        cin对象与提取运算符>>、变量名或数组名一起构成输入语句,形式为C++的格式化输出
   :cin>>…>>…>>…;,能够连续输入多项内容。只要是基本数据类型,不管是int、double、float,还是char、char *等,都可以写成这种形式,这给用户提供了很大的方便。如果要输入用户自己定义的类型数据,就要用友元方式重载>>运算符,有关这方面内容在第8讲已有介绍。

(2) 用于字符输入的流成员函数
       1)get( )函数

 get的含义是“获取,得到”的意思,在C++中,get()函数的用法很灵活,既可以输入一个字符,也可以输入一串字符,而且内容还可以是回车、tab、空格等空白字符。它有三种形式:
       a)不带参数的get()函数
格式:cin.get()
功能:读入一个字符(包括回车、tab、空格等空白字符)

char ch;
while( (ch=cin.get()) !=EOF)   //EOF为文件结束符,按ctrl+z 输入
  cout.put(ch);

b)带一个参数的get()函数
格式:cin.get(ch)
功能:读入一个字符,如果读取成功则返回非0值(真),如失败(遇到文件结束符)则函数返回0值(假)。

改写上一例:
char ch;
while(cin.get(ch))
 {  cout.put(ch);  }

c)带三个参数的get()函数
格式:cin.get(字符数组,字符个数n,终止字符)
  或 cin.get(字符指针,字符个数n,终止字符)

3)带三个参数的get()函数 (续)
功能:从输入流中读取n-1字符,赋给字符数组或字符指针所指向的数组。如果在读取n-1个字符之前遇到终止字符,则提前结束。如果成功则返回非0,失败则返回0。

例:输入包含空格的字符串
char str[80];
cout<<"请输入一个字符串:";
cin.get(str,80,'\n');
cout<<str<<endl;

2) getline( )函数
  其功能、用法与带三个参数的get( )一样,只是它的函数名更容易理解、记忆。
格式:cin.getline(字符数组或字符指针,字符个数n[,终止字符])
功能:与带三个参数的get()功能类似,从输入流中读取n-1字符,赋给字符数组或字符指针所指向的空间。如果在读取n-1个字符之前遇到终止字符(如果不写,默认为 ‘\n’),则提前结束。

(3) 几个与流操作有关的判断函数
eof()函数:是”end of file”的缩写,表示“文件结束”。到达文件末尾(即遇到文件结束符)时为“真”,否则为“假”。这个函数经常用到。
fail()函数:操作失败时返回“真”,操作成功时返回“假”。
!运算符经过了重载,它的功能与fail()函数相同,即:  !cin 与 cin.fail() 等价
 !cout 与 cout.fail() 等价

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值