七、输入/输出流--IOStreamm基本类和标准IOStream对象--头文件和标准操纵符

来源:互联网 发布:淘宝正品耐克 编辑:程序博客网 时间:2024/06/04 19:53

IOStreamm基本类和标准IOStream对象

本节主要讲述:

  • 相关头文件
  • 标准Stream操作符

1. 相关的头文件

  • <iosfwd>
  • <streambuf>
  • <istream>
  • <ostream>
  • <iostream>
    在使用这些标准输入或输出功能时,包含istream或者ostream头文件即可。如果不需要使用标准stream对象,就不需要包含iostream头文件。

如果需要使用特殊的stream,如file streams ,string stream, 参数化的操控器等,需要包含其他头文件,如<fstream>,<sstream>

2.标准stream操作符

主要介绍:

  • Output操作符
  • input操作符
  • 特殊型别的I/O操作符的格式化

2.1.Output操作符

  1. basic_ostream(ostream和wostream)将“<<”定义为Output操作符,对所有基本类型进行重载,包括char* , void* , bool等。(算术类型和流类型的重载)
  2. stream将output操作符定义为:把第二参数发送到相应的stream中。第二参数可以是任意型别。(操控器)

4种输出操作符(操控器)重载的声明:

basic_ostream& operator<< (basic_ostream& (*pf)(basic_ostream&));basic_ostream& operator<< (  basic_ios<char_type,traits_type>& (*pf)(basic_ios<char_type,traits_type>&));basic_ostream& operator<< (ios_base& (*pf)(ios_base&));basic_ostream& operator<<(    std::basic_ostream<CharT,Traits>& (*func)(std::basic_ostream<CharT,Traits>&) );

2.2.input操作符

  1. basic_istream将”>>”定义为input操作符。
  2. basic_istream对基本类型定义了重载”>>”;(算术类型和流缓冲类型的重载)
  3. basic_istream定义input操作符:读取的数值存储在第二个参数,传递方式为箭头方向。(操控器)

操控器的声明:

basic_istream& operator>>( basic_istream& st,                            std::ios_base& (*func)(std::ios_base&) );basic_istream& operator>>( basic_istream& st,                            std::basic_ios<CharT,Traits>& (*func)(std::basic_ios<CharT,Traits>&) );basic_istream& operator>>( basic_istream& st,                            std::basic_istream& (*func)(std::basic_istream&) );

2.3 特殊型别的I/O

标准I/O操作符定义了 bool 、char* 和void*型别的输入和输出。

bool:
1. 默认情况下,布尔值的读取和输出是以数字的形式出现。

  • True: 1
  • false:0

2.设立了stream的格式化选项,可以字符串的形式对布尔值进行I/O操作。

char*:
对于char*型的字符串,读入字符串时,会跳过开头的空格知道非空格或者文件结束。空格的跳过可以,可以由skipws标志控制

void*:
型别为void*的参数被传递到output操作符的时候,其地址被输出,而不是输出指针指向的内容。

例子:

char * str = "hello!";//输出地址需要void*cout << "char* : " << str << "   地址为: " << static_cast<void*>(str) << endl;    cout << "void*: " << (void*)str << endl;

结果为:

char* : hello!   地址为: 000B1D88void*: 000B1D88

2.4 操纵符

标准操纵符,(操控器或操作符都可)定义在名称空间std中,
1. 针对ios_base的操纵符有<ios>给出。
2. 针对istream和ostream操纵符由<iostream>给出
3. 复杂的由<iomanip>给出

(1).格式化标记

(以下表中前面带“*”,表示默认格式状态)

表达式 效果 boolalpha 将true和false输出为字符串 `* noboolalpha 将true和false 输出为1, 0 showbase 对整型值输出表示进制的前缀 * noshowbase 不生成表示进制的前缀 showpoint 对浮点数总是显示小数点 * noshowpoint 只有当浮点数包含小数点部分时才显示小数点 showpos 对非负数显示+ * noshowpos 对非负数不显示 + uppercase 在十六进制中打印0X,在科学计数法中打印E * nouppercase 在十六进制中打印0x,在科学计数法中打印e * dec 整数值显示十进制 hex 整数值显十六进制 oct 整数值显示八进制 left 在值的右侧添加填充字符 right 在值的左侧填充填充字符,右对齐 internal 在符号和值之间填充字符 fixed 浮点数显示为定点十进制 scientific 浮点数显示为科学计数法 hexfloat 浮点数值显示为十六进制 【c++11】 defaultfloat 重置浮点数格式为十进制【c++11】 unitbuf 每次输出操作刷新缓冲区 *nounitbuf 回复正常的缓冲区刷新方式 * skipws 输入运算跳过空白符 noskipws 输入运算符不跳过空白符

(2) 格式化操纵符

表达式 效果 resetiosflages() 清除标志 setiosflags() 设置标志 setbase(b) 将整数输出为b进制 setfill(ch) 用ch填充空白 setprecision(n) 将浮点精度设为n setw(w) 读取或写入值的宽度为w个字符,定义于头文件 <iomanip> flush() 刷新ostream 缓冲区 ends() 插入空白符,然后刷新ostream缓冲区 endl() 插入换行,然后刷新缓冲区

(3)部分格式化函数

需要通过stream类对象来调用这些函数

  • fill() :防止当前填充字符
  • fill(int ch) : 设置填充字符,返回先前填充字符
  • precision(): 返回当前精度
  • precision(int p): 设置精度
  • setf(int m ): 设置掩码m的or表达式标记,返回先前的标记
  • setf(int m1,int m2): 设置掩码m1,关闭掩码m2
  • unsetf(int m): 关闭掩码m的or表达式中的标记
  • width() : 返回当前的宽度
  • width(int w): 设置宽度为w,返回先前的宽度

例子:

    // boolalpha    cout << "默认:" << true << " " << false << endl;    cout << "boolalpha: " <<boolalpha<< true << " " << false << endl;    cout << noboolalpha << endl; //恢复    //指定进制    cout << showbase;    cout << "默认十进制:" << 20 << endl;    cout << "八进制: " << oct << 20 << endl;    cout << "十六进制: " << hex << 20 << endl;    cout << dec<<noshowbase << endl;    //精度    cout << "当前精度: " << cout.precision() << ", 值:" << sqrt(2.0) << endl;    cout << "修改精度,返回之前精度: " << cout.precision(8) << ", 值: " << sqrt(2.0) << endl;//也可采用setprecision(8)    //补空,字符的显示宽度setw()  定义于头文件 <iomanip>    int i = 12;    double d = 3.12345;    cout << showpos;//显示非负数符号    cout << "数: " << setw(12) <<i<< ":尾部" << endl;    cout << "数: " << setw(12) << d<< ":尾部" << endl;    cout << setfill('#')//填充空白        << "数: " << setw(12) << i << ":尾部" << endl        << "数: " << setw(12) << d << ":尾部" << endl;

结果为:

默认:1 0boolalpha: true false默认十进制:20八进制: 024十六进制: 0x14当前精度: 6, 值:1.41421修改精度,返回之前精度: 6, 值: 1.4142136数:          +12:尾部数:     +3.12345:尾部数: #########+12:尾部数: ####+3.12345:尾部
阅读全文
0 0
原创粉丝点击