引言:
C++除了完全支持C 语言的输入输出系统外,还定义了一套面向对象的输入输出系统。为什么C ++还要建立自己的输入输出系统。
原因在于C 语言的输入输出系统不支持用户自定义的对象。
例一:struct complex{ int x; int y; }my_cpmplex; printf("%struct",my_complex);
对此结构类型,在C语言中下面的语句是不能接受的。
因为printf( )函数只能识别系统预定义的类型,而没有办法对新的数据类型进行扩充.。用C++的输入输出系统,就可以通过重载“<<”和“>>”运算符来解以上问题。 C++的类机制允它建立一个可扩展的输入输出系统,它可以通过修改和扩展来加入用户自定义类型及相应操作。
例二:#include<iostream> using namespace std; class complex{ int x; int y; public: complex(){ x=1; y=1; } friend ostream& operator << (ostream& out ,const complex &com){ cout<<com.x<<","<<com.y; return out; } }; int main(void){ complex my_complex; cout<<my_complex; return 0; }
基于函数库的控制台I/O
基于函数库的控制台输入/输出是C语言标准库的功能,C++保留了这些功能
1、输出
在C++的标准函数库中提供了下面的控制台输出函数(在头文件cstdio或stdio.h中声明)
1、printf( )函数
格式字符 类型 输出格式 %c char 以字符型输出,输出一个字符 %d,i int 以有符号的十进制输出 %ld long [int] 以长整型输出 %hd short [int] 短整型 %o unsigned int 以无符号八进制输出 %u unsigned int 以无符号十进制输出 %x unsigned int 以无符号十六进制(abcdef)输出 %X unsigned int 以无符号十六进制(ABCDEF)输出 %e double 以指数形式输出,指数用’e’表示 %E double 以指数形式输出,指数用’E’表示 %lf double 以双精度小数形式输出 %f float 以单精度小数形式输出 %s char * 输出字符串 %% 无 % 2、putchar( )函数
输出字符
3、puts( )函数
输出字符串2、输入
1、scan( )函数
同printf( )函数
基于类库的控制台I/O
1、预定义的控制台对象
在I/O类库中预定义了4个I/O对象:cin、cout、cerr、clog
2、输出
任何基本数据类型的数据和指针都可以通过cout、cerr、clog对象和插入操作符"<<" 进行输出。
#include<iostream> using namespace std; int main(void){ int x=1; char ch='a'; float f=1.2433; int *p=&x; cout<<x; cout<<ch; cout<<f; cout<<p; return 0; }
注意:
对于指针的输出有一个特例,即输出指向字符串的指针时,并不输出字符串的首地址,而是输出字符串。#include<iostream> using namespace std; int main(void){ const char *p="abcd"; cout<<p;//输出abcd cout<<(void *)p;//输出p的值 }
C++ 中常用的输出流操纵算子(也叫格式控制符)。它们都是在头文件 iomanip 中定义的。要使用这些流操纵算子,必须包含该头文件。
流操纵算子 作用 *dec 以十进制形式输出整数 hex 以十六进制形式输出整数 oct 以八进制形式输出整数 fixed 以普通小数形式输出浮点数 scientific 以科学计数法形式输出浮点数 left 左对齐,即在宽度不足时将填充字符添加到右边 *right 右对齐,即在宽度不足时将填充字符添加到左边 setbase(b) 设置输出整数时的进制,b=8、10 或 16 setw(w) 指定输出宽度为 w 个字符,或输人字符串时读入 w 个字符 setfill( c ) 在指定输出宽度的情况下,输出的宽度不足时用字符 c 填充(默认情况是用空格填充) setprecision(n) 设置输出浮点数的精度为 n。 setiosflags (标志) 将某个输出格式标志置为 1 resetiosflags(标志) 将某个输出格式标志置为 0 boolapha 把 true 和 false 输出为字符串 *noboolalpha 把 true 和 false 输出为 0、1 showbase 输出表示数值的进制的前缀 *noshowpoint 只有当小数部分存在时才显示小数点 showpos 在非负数值中显示 + *noshowpos 在非负数值中不显示 + *skipws 输入时跳过空白字符 noskipws 输入时不跳过空白字符 uppercase 十六进制数中使用 A~E。若输出前缀,则前缀输出 0X,科学计数法中输出 E *nouppercase 十六进制数中使用 a~e。若输出前缀,则前缀输出 0x,科学计数法中输出 e。 internal 数值的符号(正负号)在指定宽度内左对齐,数值右对 齐,中间由填充字符填充 说明:
“流操纵算子”栏中的星号*不是算子的一部分,星号表示在没有使用任何算子的情况下,就等效于使用了该算子。例如,在默认情况下,整数是用十进制形式输出的,等效于使用了 dec 算子。
使用这些算子的方法是将算子用<<和 cout 连用。
例二:#include<iostream> #include<iomanip> using namespace std; int main(void){ cout<<hex<<18<<endl; cout<<oct<<10<<endl; cout<<fixed<<10.123<<endl; cout<<scientific<<10.12345<<endl; cout<<left<<set(10)<<100<<endl; cout<<setfill('+')<<setw(10)<<100<<endl; return 0; }
输出结果
12 12 10.123000 1.012345e+001 144 144+++++++