在前面,输入/输出的数据没有指定格式,它们都按缺省的格式输入/输出。然而,有时需要对数据格式进行控制。这时需利用ios类中定义的格式控制成员函数,通过调用它们来完成格式的设置。ios类的格式控制函数如下所示:
| long flags( ) const | 返回当前的格式标志。 |
| long flays(long newflag) | 设置格式标志为newflag,返回旧的格式标志。 |
| long setf(long bits) | 设置指定的格式标志位,返回旧的格式标志。 |
| long setf(long bits,long field) | 将field指定的格式标志位置为bits,返回旧的格式标志。 |
| long unsetf(long bits) | 清除bits指定的格式标志位,返回旧的格式标志。 |
| long fill(char c) | 设置填充字符,缺省条件下是空格。 |
| char fill( ) | 返回当前填充字符。 |
| int precision(int val) | 设置精确度为val,控制输出浮点数的有效位,返回旧值。 |
| int precision( ) | 返回旧的精确度值。 |
| int width(int val) | 设置显示数据的宽度(域宽),返回旧的域宽。 |
| int width( ) | 只返回当前域宽,缺省宽度为0。这时插入操作能按表示数据的最小宽度显示数据。 |
预定义的操纵算子
使用成员函数控制格式化输入输出时,每个函数调用需要写一条语句,尤其是它不能用在插入或提取运算符的表达式中,而使用操纵算子,则可以在插入和提取运算符的表达式中控制格式化输入和输出。在程序中使用操纵算字必须嵌入头文件iomanip.h
| dec | 十进制的输入输出 |
| hex | 十六进制的输入输出 |
| oct | 八进制的输入输出 |
| ws | 提取空白字符 |
| ends | 输出一个nul字符 |
| endl | 输出一个换行字符,同时刷新流 |
| flush | 刷新流 |
| resetiosflags(long) | 请除特定的格式标志位 |
| setiosflags(long) | 设置特定的格式标志位 |
| setfill(char) | 设置填充字符 |
| setprecision(int) | 设置输出浮点数的精确度 |
| setw(int) | 设置域宽格式变量 |
错误处理
在对一个流对象进行I/O操作时,可能会产生错误。当错误发生时,错误的性质被记录在ios类的一个数据成员中。
ios类中定义的描述错误状态的常量:
| goodbit | 没有错误,正常状态 eofbit 到达流的结尾 |
| failbit | I/O操作失败,清除状态字后,可以对流继续进行操作。 |
| badbit | 试图进行非法操作,清除状态字后,流可能还可以使用。 |
| hardfail | 致命错误,不可恢复的错误。 |
ostream类的成员函数
流的其它成员函数可以从流中读取字符或字符串,对流进行无格式化的输入 输出操作,以及直接控制对流的I/O操作。
| 返回类型 | ios类的成员 | 描 述 |
| ostream* | tie(ostream*) | 将当前流与指定的输出流连接起来。每当需要 读取当前流时,连接的流会自动刷新。C++流库已用cin.tie(cout)将输入流与输出流连接起来。要取消与输出流的连接可采用is.tie(0) |
| ostream* | tie( ) | 返回指向连接流的指针 |
| 返回类型 | ostream类的成员 | 描 述 |
| ostream& | put(char ch) | 向流中输出一个字符ch,不进行任何转换 |
| ostream& | write(char*,int) | 向流中输出指定长度的字符串,不进行转换 |
| ostream& | flush( ) | 刷新流,输出所有缓冲的但还未输出的数据 |
| ostream& | seekp(streampos) | 移动流的当前指针到给定的绝对位置 |
| ostream& | seekp(sereamoff,seek_dir) | 流的当前指针类似与文件的当前指针 |
| streampos | teelp( ) | 返回流的当前指针的绝对位置 |
istream类的成员函数
| 返回类型 | istream类的成员 | 描 述 |
| int | get( ) | 读取并返回一个字符 |
| istream& | get(char&c) | 读取字符并存入c中 |
| istream& | get(char*ptr,int len,char delim='') | 读取指定的字符到缓冲区中,直到遇到指定的分界符为止,分界符不填入缓冲区。 |
| istream& | getline(char*ptr,int len,char delim='') | 与get(char*ptr,int len,chardelim ='') 类似,但将分界符填入缓冲区。 |
| istream& | putback( ) | 将最近读取的字符放回流中 |
| istream& | read(char*,int) | 读取规定长度的字符串到缓冲区中 |
| int | peek( ) | 返回流中下一个字符,但不移动文件指针 |
| istream& | seekg(streampos) | 移动当前指针到一绝对地址 |
| istream& | seekg(streampos,seek_dir) | 移动当前指针到一相对地址 |
| streampos | tellg( ) | 返回当前指针 |
| istream& | ignore(int n=1,delim=EOF) | 跳过流中几个字符,或直到遇到指定的分界符为止 |