流和缓冲区
c++ 程序把输入和输出看做字节流.输入时,程序从输入流中抽取字节,输出时,程序将字节插入到输出流中.
缓冲区:缓冲区可以搞笑的处理输入和输出.缓冲区是作用中介的内存块,它是将信息从设备传输到程序,或从程序传输给设备的临时存储工具.
缓冲方法: 从磁盘上读取大量信息,将这些信息存储在缓冲区,然后每次从缓冲区里读取一个字节,因为从内存中读取单个字节的速度比从硬盘上读取快的多,所以 缓冲方法就更快.
cin | cin对象用于标准输入流,默认和标准输入设备关联 |
cout | cout对象用于标准输出流,默认和标准输出设备关联 |
重载的 << 运算符
c++ 和 c 的输出不同的是 c 在输出时要标注 即将读取的 数据类型 例: printf("%d",n),标注要读取的类型为 int 型,
而 c++ 却不用标注例 : cout << n;
原因就是 c++ 的 ostream 类重新定义 << 为 插入运算符, 然后 插入运算符被重载,使之能识别所有的基本类型
- unsigned char;
- signed char;
- char;
- short;
- unsigned short;
- int;
- unsigned int;
- long;
- unsigned long;
- long long(c++ 11);
- unsigned long long (c++ 11);
- float;
- double;
- long double;
- const signed char *;
- const unsigned char *;
- const char *;
- void *;
函数原型(以 int 为例)
ostream & operator << (int);
注意:这里的返回值 是 ostream & ,这意味着 可以将 cout 连续拼接输出.
引用将指向用于调用该运算符的对象
例: cout << 1 << 2;
程序先运行 cout << 1,然后 返回值是 cout,程序就变成了 cout << 2;
ostream 类 还提供了put()方法 – 用于显示字符 和 write() 方法-- 用于显示字符串
write 模板原型
basic_ostream<charT,traits>& write(const char_type* s,streamsize n);
write 第一个参数是字符串的地址,第二个参数是显示的字符个数
注意 : write 不会在遇到空字符时自动停止,而只是打印制定数目的地府,即使 n 大于 字符串的长度(越界).
刷新缓冲区
上面提到了 ostream 类对 cout 对象处理的输出进行行缓冲,所以 输出的语句不会直接输入,要先存入缓冲区,等缓冲区满或者缓冲区被刷新,才会输出.
大多c++ 都会在输入即将发生时刷新缓冲区.
或者使用 flush 刷新缓冲区.
flush(cout) 或者 cout << flush;
cout格式化输出
进制
dec | 十进制 | decimal |
hex | 十六进制 | hexadecimal |
oct | 八进制 | octal |
例: cout << hex;
接下来 用cout 以十六进制输出.
完成一次设置后,直到格式状态设置为其他选项为止,否则 在本程序内,一直以 十六 进制输出.
字段宽度
int width(int i) 返回值为 当前所设置的的宽度,.i 为 将字段宽度设置为 i 个空格. 默认为 右对齐
返回值 可以在 恢复 以前的设置时用.
注: 当数据长度 与 宽度不匹配时,c++ 不会截断数据,
注:width() 方法 只影响接下来被显示的一个项目
填充字符
在默认情况下,c++ 用空格填充字段中未被使用的部分.
fill() 成员函数 可以用来改变填充字符.
例 : cout.fill(’*); —用 **号填充未被使用的部分.
注:新的填充字符将一直有效,直到更改为止
设置浮点数的显示精度
precision(int i) 成员函数,
precision 显示的是总位数, 一共 i 位.
注:新的精度设置将一直有效,直到被重新设置
打印末尾的 0 和小数点
ios_base 类 提供了 setf() 函数
例: cout.setf(ios_base::showpoint) — 设置末尾小数点
常量 | 含义 |
---|---|
ios_base::boolalpha | 输入和输出bool值,可以为 true或 false |
ios_base::showbase | 对于输出,使用c++ 基数前缀 (0,0x) |
ios_base::showpoint | 显示末尾的小数点 |
ios_base::uppercase | 对于16进制输出,使用大写字母E 表示法 |
ios_base::showpos | 在正数前面加上 + (只要不重新被设置,一直都在) |
第二个setf(long long )的参数wei
第二个参数 | 第一个参数 | 含义 |
---|---|---|
ios_base::basefield | ios_base::dec | 使用基数 10 |
ios_base::basefield | ios_base::oct | 使用基数 8 |
ios_base::basefield | ios_base::hex | 使用基数 16 |
ios_base::floatfield | ios_base::fixed | 使用定点计数法 |
ios_base::floatfield | ios_base::scientific | 使用科学计数法 |
ios_base::adjustfield | ios_base::left | 使用左对齐 |
ios_base::adjustfield | ios_base::right | 使用右对齐 |
ios_base::adjustfield | ios_base::internal | 符号或基数前缀左对齐值右对齐 |
对于 定点计数法和科学计数法
注: 精度指的是小数位数,而不是总位数
注: 显示末尾的 0
标准控制符
控制符 | 调用 |
---|---|
boolalpha | setf(ios_base::boolalpha) |
noboolalpha | unsetf(ios_base::noboolalpha) |
showbase | setf(ios_base::showbase) |
noshowbase | unsetf(ios_base::showbase) |
showpoint | setf(ios_base::showpoint) |
noshowpoint | unsetf(ios_base::showpoint) |
showpos | setf(ios_base::showpos) |
noshowpos | unsetf(ios_base::showpos) |
uppercase | setf(ios_base::uppercase) |
nouppercase | unsetf(ios_base::uppercase) |
internal | setf(ios_base::internal,ios_base::adjustfield) |
left | setf(ios_base::left,ios_base::adjustfield) |
right | setf(ios_base::right,ios_base::adjustfield) |
dec | setf(ios_base::dec,ios_base::basefield) |
hex | setf(ios_base::hex,ios_base::basefield) |
oct | setf(ios_base::oct,ios_base::basefield) |
fixed | setf(ios_base::fixed,ios_base::floatfield) |
scientific | setf(ios_base::scientific,ios_base::floatfield) |
例:
cout.(setf(ios_base::left,ios_base::adjustfield) --设置左对齐
cout.(setf(ios_base::showpos) – 若是正数 则加 +
cout.precision(3) – 保留 3 位数
iomanip
iomanip 头文件提供 最常用的 3个控制符 .
setprecision() – 用来控制精度
setw() – 用来控制 宽度
setfill() – 用来控制 填充字符
注: 这三个一旦被设置就一直存在,直到被更改
例:
cout << setw(4) << ‘N’;
cout << setprecision(3) << ‘N’;
cout << setw(5) << setfill( ‘*’) << ‘N’;