13 Stream
13.2 基本的Stream类别和Stream对象
其中,typedef basic_ios<char> ios; //针对char的特化版本,wios是针对wchar_t的特化版本。
全局性的Stream对象:cin,cout,cerr,clog,wcin,wcout,wcerr,wclog。
头文件:
<iosfwd>:内含stream classes的前置说明。此文件是必要的,因为前置说明不能简单的加一句诸如class ostream;这样的声明就行了。
<streanbuf>:basic_streambuf<>的定义。
<istream>:内含basic_istream<>和basic_iostream<>的定义。
<ostream>:内含basic_ostream<>的定义。
<iostream>:内含全局性的stream对象(cin、cout等)的定义。
参数化的操控器(manipulators)、file streams、string streams需要包含其他头文件(<iomanip>, <fstream>, <sstream>, <strstream>)。
13.3 <<和>>
bool:缺省情况下,布尔值的读入和输出均以0、1表示。
char和wchar_t:缺省跳过起头的空格,如果想读入所有字符,包括空格,可清楚skipws标志或使用成员函数get()。
char*:跳过起头的空格,一直读到非空格或end-of-file。
void*:打印或读入指针。
stream buffer:直接读取或改写stream buffer。
13.4 stream的状态
使用方法:这些常数定义于class ios_base中,可以std::ios_base::eofbit,也可以std::ios::eofbit(ios派生自ios_base)。
注意:当读到end-of-file之后继续读取时,eofbit和failbit会同时设立。
while(std::cin >> obj){...} //此时的cin用于条件判断,返回值cin会调用operator void*,返回stream是否发生错误。
if(!(std::cin >> x)){...} //调用operator !。
13.5 标准I/O函数
1、输入相关成员函数
举例:istream::getline()读入的内容包括换行符号或delim,而非在两者之前就终止,但是不存储与str中。读入的字符序列以字符串终止符号位结尾(如'\0')。
2、输出相关成员函数
put、write、flush。
13.6 操控器
实际上,ostream& ostream::operator << (ostream& (*op)(ostream&)){return (*op)(*this);},注意endl()等是模板函数。
13.7 格式化
成员型别ios::fmtflags用来存储组态标志。
相应的操控器:setiosflags(flags),resetiosflags(mask)(清除mask所标识的一组)。注意对于含有参数的操控器,一定要加上<iomanip>。
用法举例:std::cout.setf(std::ios::showpos | std::ios::uppercase),
std::cout<<resetiosflags(std::ios::adjustfield)<<setiosflags(std::ios::left)。
布尔值:标志boolalpha(以文字表示bool值),对应操控器boolalpha,noboolalpha。
字段宽度、填充字符、位置调整:掩码adjustfield,标志left、right、internal,操控器setw(val)、setfill(c)、left、right、internal。
正记号:标志showpos(在正数前加上正记号),操控器showpos、noshowpos。
大写字符:标志uppercase,操控器uppercase、nouppercase。
数值进制:掩码basefield,标志oct、dec、hex,操控器oct、dec、hex。举例:cout.setf(ios::hex, ios::basefield);//设置一个标志,同时清除同组的其他标志;
显示数值进制:标志showbase(八进制以0开头,16进制以0x开头),操控器showbase、noshowbase。
浮点数:掩码floatfield,标志fixed(小数计数法)、scientific,操控器fixed、scientific;
小数点:标志showpoint(总是带有小数点),操控器showpoint、noshowpoint;
精度:操控器setprecision(val)(以val为新的精度)。
标志skipws(调用>>时,自动跳过起始空格),操控器skipws、noskipws。
标志nounitbuf(每次输出后,清空output缓冲区),操控器unitbuf、nounitbuf。
13.8 国际化相关成员函数
imbue(loc)设置locale对象。getloc()返回当前local对象。
widen(c)把字符c转换为stream字符集中的字符。
narrow(c,def)把stream字符集中的c转换为一个char字符,如果无对应字符,返回def。
13.9 文件存取:ifstream、ofstream、fstream、filebuf
1、文件标志
ofstream file(filename.c_str()); //file stream class不以string作为构造函数的参数。
ofstream file(“abc.txt”, ios::out | ios::app);
成员函数:(实际上file stream所拥有的文件是隐式打开或关闭的,但也可使用成员函数显示操作)
open(name),open(name,flags),close(),is_open()。
如:ifstream file; file.open("abc.txt"); ...; file.clear();//使得该file stream处于良好状态。 file.close();
2、随机存取
注意:file.tellg()的返回值型别是std::ios::pos_type(即std::streampos,并不是整数型别),偏移量为ios::off_type(即streamoff,是个有符号整数),相对位置有beg、cur、end。