标准类库是一个非正式的标准,只是由头文件iostream和fstream中定义的类组成。
l 流和缓冲区
C++程序把输入和输出看作字节流。输入时,程序从输入流中抽取字节;输出时,程序将字节插入到输出流中。
管理流和缓冲区的工作有点复杂,不过iostream文件中包含了一些专门设计用来实现、管理流和缓冲区的类。
一些类:
n streambuf类为缓冲区提供了内存,并提供了用于填充缓冲区、访问缓冲区内容、刷新缓冲区和管理缓冲区内存的类方法
n ios_base类表示流的一般特征,如是否可读取、是二进制流还是文本流等。
n ios类基于ios_base,其中包括了一个指向streambuf对象的指针成员。
n ostream类是从ios类派生而来的,提供了输出方法。
n istream类也是从ios类派生而来的,提供了输入方法。
n iostream类是基于istream和ostream类的,因此继承了输入方法和输出方法。
C++的iostream类库管理了很多细节。例如,在程序中包含iostream文件将自动创建8个流对象
n cin对应于标准输入流,默认情况关联到标准输入设备(键盘)。wcin对象与此类似,但处理的是wchar_t类型。
n cout对象与标准输出流相对应,默认情况关联到标准输出设备(显示器)。wcout对象与此类似,但处理的是wchar_t类型。
n cerr对象与标准错误流相对应。在默认情况下,关联到标准输出设备(显示器)。wclog与此类似
n clog对象也对应着标准流,但是这个流被缓冲。
使用cout进行输出
插入操作符被重载,使之能够识别C++中所有的基类类型。此外ostream类还为下面的指针类型定义了插入操作符函数:
n const signed char*;
n const unsigned char*;
n const char*;
n void *;
刷新缓冲区
cout<<flush;
cout<<endl;
对cout进行格式化
默认情况下:
n 对于char值,如果它代表的是可打印字符,则将被作为一个字符显示在宽度为一个字符的字段中。
n 对于数值整形,将以十进制方式显示在一个刚好容纳该数字及负号的字段中。
n 字符串被显示在宽度等于该字符串长度的字段中。
n 浮点类型被显示为6位,末尾的0不显示。当指数>=6或<=-5时,将使用科学计数法表示。
修改计数系统
十六进制:hex(cout);等价于cout<<hex;
十进制:cout<<decimal;
八进制:cout<<octal;
调整字段宽度:
int width();//当前设置
int width(int i);//字段宽度设置为i个字符,包括小数点
width()方法只影响将显示的下一个项目,然后将字段宽度恢复为默认值。
C++永远不会截短数据。
填充字符
eg:cout.fill(‘*’);
此方法一直有效,直到更改它为止。
设置浮点数的显示精度
浮点数数度的含义取决于输出模式。在默认情况下,它指的是显示的总位数。在定点模式和科学模式下,精度指的是小数点后面的倍数。
cout.precision(2);
打印末尾的0和小数点
cout.setf(ios_base::showpoint);
显示末尾小数点
关于setf()
setf()函数的第一个原型
fmtflags setf(fmtflags);
第二个原型
fmtflags setf(fmtflags,fmtflags);
第一个参数指出要设置的位,第二个参数指出要清楚哪些位。
eg:
ios_base::fmtflags old = cout.setf(ios::left,ios::adjustfield);
格式常量
常量 | 意义 |
ios_base::boolalpha | 输入输出bool值 |
ios_base::showbase | 对于输出,使用C++基数前缀(0,0x) |
ios_base::showpoint | 显示末尾的小数点 |
ios_base::uppercase | 对于16进制,使用大写字母,E表示法 |
ios_base::showpos | 在正数前面加上+ |
setf(long,long)的参数
第二个参数 | 第一个参数 | 含义 |
ios_base::basefield | ios_base::dec | 使用基数10 |
| ios_base::oct | 使用基数8 |
| ios_base::hex | 使用基数16 |
ios_base::floatfield | ios_base::fixed | 使用定点计数法 |
| ios_base::scientific | 使用科学计数法 |
ios_base::adjustfield | ios_base::left | 使用左对齐 |
| ios_base::right | 使用右对齐 |
| ios_base::internal | 符号或基数前缀左对齐,值右对齐 |
标准控制符
使用setf() 不是进行格式化的,对用户最为友好的方法,C++提供了多个控制符,能够调用setf(),并自动提供正确的参数。
eg:
cout<<left<<fixed;
以上两个表格中的项如internal,scientific,showbase等都可用作标准控制符。
C++在iomanip头文件中提供了其他一些控制符,3个最常用的控制符setprecision(),setfill()和setw()
l 使用cin进行输入
istream类还为下列字符指针类型重载了>>抽取操作符
signed char *;char *;unsigned char *;
cin>>如何检查输入
跳过空白(空格、换行符和制表符),直到遇到非空白字符。它读取从非空白字符开始,到与目标类型不匹配的第一个字符之间的全部内容。
cin或cout对象包含一个描述流状态的数据成员(stream state)。流状态由3个ios_base元素组成:eofbit/badbit/failbit。当cin操作到达文件末尾时,它将设置eofbit;当cin操作未能读取预期的字符时,它将设置failbit.在一些无法诊断的失败破坏流时,badbit被设置。
设置状态
clear(),全部清0
clear(eofbit);eofbit将被设置,另外两个状态位被清除。
setstate(eofbit);只设置eofbit其它位不变
使用exceptions()方法来控制异常如何被处理。
eg:
cin.exceptions(badbit|eofbit);
如果badbit和eofbit随后被设置,将引发异常。
设置流状态位有一个非常重要的后果:流将对后面的输入或输出关闭,直到位被清楚。
isspace()是一个cctype函数,它在参数是空白字符时返回true.fail()在failbit或eofbit()被设置时返回true.
其它istream类方法
get(char&)和get(void)方法提供不跳过空白的单字符输入功能。
get(char *,int,char)和getline(char*,int,char)函数在默认情况下读取整行,而不是一个单词。
单字符输入
eg:
int ct=0;
char ch;
cin.get(ch);
while(ch!=’/n’)
{
cout<<ch;
ct++;
cin.get(ch);
}
cout<<ct<<endl;
如果程序使用>>
则输入时的空格在显示时就会被删除。
也可以这样:ch=cin.get();
如果希望跳过空白,则使用>>,如果不路过,get(char &)效果更佳。
字符串输入
istream &get(char *,int,char);
istream &get(char *,int);
istream &getline(char *,int,char);
istream &getline(char *,int);
cin.ignore(255,’\n’);
读取并丢弃接下来的255个字符或直到到达第一个换行符。
get(char *,int)和getline()会影响流状态。当不能抽取字符时,这两个方法瘵设置failbit位。不能抽取字符的情况有两种,一是输入方法立刻到达了文件尾,二是输入了一个空行。当读了最大数目的字符,且行中还有其他字符时,getline()也会设置failbit
其它istream方法
peek()函数返回输入中的下一个字符,但不抽取输入字符。gcount()返回最后一个非格式化抽取方法读取的字符数。putback()函数将一个字符插入到输入字符串中,被插入的字符是下一条输入语句读取的第一个字符。
l C++在头文件fstream中定义了多个新类,其中包括用于文件输入的ifstream类和用于文件输出的ofstream类。
方法c_str()来给ofstream和ifstream的构造函数提供一个C-风格字符串参数。
文件模式
常量 | 含义 | 常量 | 含义 |
ios_base::in | 打开文件,以便读取 | ios_base::app | 追加到文件尾 |
ios_base::out | 打开文件,以便写入 | ios_base::trun | 如果文件存在,截短 |
ios_base::ate | 打开文件,并移到文件尾 | ios_base::binary | 二进制文件 |
文本文件指的是将所有内容都存储为文本。对于字符来说,二进制文件与文本表示是一样的,即字符的ASCII码的二进制表示。对于数字来说,二进制文件与文本表示有很大的差别。存取二进制文件采用write()和read()方法。
fstream继承了两个重要方法:
seekg().前者将输入指针移到指定的文件位置
seekp()后者将输出指针移到指定的位置。
seekg()两个原型
istream & seekg(streamoff,ios_base::seekdir);
istream &seekg(streampos);
seekdir的三个值:
ios_base::beg
ios_base::cur
ios_base::end
使用临时文件
char *tmpname(char *pszName)
eg:
char pszName[L_tmpnam]={‘\0’};
for(…){…tmpnam(pszName);}
l iostream族支持程序与终端IO
fstream族支持程序与与文件之间的IO
sstream族支持string对象之间的IO
读取string对象中的格式化信息或将格式化信息写string对象中被称为内核格式化。
全部完