13.2 流
非格式化与格式化I/O
非格式化I/O(低层次I/O):通过字节的方式从设备传输到内存传输,提供速度快、容量大的传输
格式化I/O(高层次I/O):通过字节组成特定的字符串、整数、浮点数和用户自定义类型传输,可能会导致性能的问题,传输大容量的文件速度较慢,并且可移植性也存在问题
传统流和标准流
传统流:传统流库允许输入/输出char
类型的字符,一个char
类型的字符占一个字节
标准流:标准流库允许输入/输出wchar_t
类型的Unicode字符,一个wchar_t
类型的字符占两个字节
iostream
库的头文件
<iostream>
头文件包换I/O流操作基本服务
cin、cout、cerr、clog
<iomanip>
头文件包括参数化流操纵符
setw、setprecision
<fstream>
头文件包含文件处理服务
输入/输出流的类和对象
typedef
声明数据类型同义词
typedef Card *CardPtr;//将类型名CardPtr定义为Card*的同义词
使用typedef
定义的同义词知识创建了一个名称,而并没有创建新的数据类型
标准流对象
-
cin
连接标准输入设备,通常是键盘 -
cout
连接标准输出设备,通常是显示屏 -
cerr
连接标准错误设备,对象cerr
的输出无缓冲,每个针对cerr
的对象必须立刻输出显示,用于迅速提示用户出现错误 -
clog
连接标准错误设备,对象clog
的输出有缓冲,对于clog
的错误输出将会保存在缓存区内,知道缓存区被填满时才会输出
13.2 输出流
ostream
提供格式化和非格式化的输出功能
-
流插入运算符(<<)执行标准数据类型的输出;成员函数
cin.put()
进行字节输出;成员函数cin.write()
进行非格式化输出 -
hex;oct;dec
进行十六进制、八进制、十进制输出,参数化流操纵符setbase()
设置制定进制输出 -
setprecision();
指定浮点数精度输出;fixed;
选择小数点后位数而不是有效数字;scientific;
指定使用可续计数法输出;showpoint;
指定小数格式的输出 -
setw();width();
用于设置输出/输入域宽 -
cout.fill();setfill()
用于填充空白区域 -
uppercase;
用于设置科学计数法或者十六进制的字母大写格式输出
char*
变量的输出
当要输出字符串第一个字符的地址时,应该将地址的
char*
类型转换为void*
类型,因为<<
运算法被重载为读取到最后一个以空字符串结尾的字符串
int main(){ const char *const word = "again"; cout<<static_cast<const void*>(word)<<endl; }
使用成员函数put
进行字符输出
cout.put('A').put('\n').put(65)
1、成员函数put
可以输出单个字符,可以使用级联输出
2、可以使用代表ASCII值的数字表达式作为参数进行输出
成员函数cout.write(string1, size)
两个参数分表示输出的字符串以及输出的长度,可以结合cin.gcount()
一起使用
int main(){ const size_t size = 80; char buffer[size]; cin.read(buffer, 20);//读取20个字符 cout.write(buffer, cin.gcount());//输出20个字符 }
13.3 输入流
流提取运算符(>>)
流提取运算符跳过输入流中空白字符进行读取,并且每次读取会返回一个cin对象的引用,读取到文件尾会返回一个空指针
istream
成员函数
成员函数cin.eof()
当读取到文件尾之后的字符时被设置为true
,否则为false
,判定是否读取到文件尾的标识符是EOF
,windows下为ctrl+z
,表示的值为-1
成员函数cin.get()
-
无参数
cin.get()
,读取一个字符,包括空白字符,读取到'\n'停止,会返回提取值 -
带一个字符引用参数的
cin.get(string1);
,将输入流中的下一个字符输入包括空白字符并保存至该字符引用参数内 -
带三个参数
cin.get(string1, size, interval);
三个参数分别是字符串数组,字符串长度,分隔符(默认为'\n')。
注意:分隔符不会放入数组中,一个数组最多可以读取“最大长度-1”,因为最后一个位置放置结尾符。分隔符仍将保存在输入流中,因此如果不进行跳过(cin.ignore()
)则下一个数组为空
成员函数cin.getline(string1, size, interval)
其功能与带三个参数的成员函数cin.get(string1, size, interval)
相似,不同点是:
getline()
读到分隔符后停止并且会将分隔符从输入流中删除;get()
读到分隔符后停止但分隔符仍保存在输入流中
成员函数cin.peek()
返回输出流中的下一个字符,并且不将他从流中去除
成员函数cin.ignore()
读取并丢弃一定数量的字符(默认为一个字符),或者遇到指定分隔符(EOF)停止
成员函数cin.putback()
将先前使用get()
函数从输入流里获得的字符再放回到流中
成员函数cin.read(string1, size)
两个参数分别表示读取字符存入的数组以及存入字符的数量,读取的字符包括空白字符
成员函数cin.gcount()
返回最近一次输入操作所读取的字符数
13.4 流操纵符
整形流的基数:doc, oct, hex, setbase()
doc
:十进制输出
oct
:八进制输出
hex
:十六进制输出
setbase(size)
:指定进制输出
四者都为“黏性”流操纵符,对之后的输出都有效
浮点精度precision, setprecision()
precision()
为ios_base
成员函数,不含参数返回当前的精度设置,含有一个参数返回先前精度设置
流操纵符setprecision(accuracy)
二者都为“黏性”设置,会总用于之后的所有输出
域宽cout.width(), setw(size)
width()
为ios_base
成员函数,不含参数返回当前的域宽设置,含参数的返回先前的域宽设置
width()
可以控制输入输出的精度
int main(){ int widthValue = 4; char sentence[10]; cin.width(5);//每次会读取4个字符,最后一个字符为结尾符 cin>>sentence; }
流操纵符setw(size)
二者都为“非黏性”设置,之后会默认设置为0
自定义流操纵符
#include<iostream> using namespace std; operator& carriageReturn(ostream& output){ return output<<'\r'; } int main(){ cout<<'......'<<carriageReturn<<'----'; }
13.5 流的格式状态和流操纵符
以下所有流操纵符都属于类ios_base
尾数零和小数点showpoint
showpoint
强制要求浮点数的输出必须带小数点和尾数零
cout<<showpoint<<79.0;//浮点数79.0当不使用
showpoint时显示79,使用时显示79.000000
对齐left, right, internal
left
:让输出左对齐
right
:让输出右对齐
internal
:让基数左对齐,数值部分右对齐
内容填充fill(), setfill()
成员函数cout.fill()
指定对齐域填充字符,无参数时返回之前的填充字符
整形流的基数showbase
showbase
要求进制输出时显示前面的基数,如十六进制以0x或者0X开头,八进制以0开头
该流操纵符为"黏性"
浮点数、科学计数法、定点小数计数法scientific, fixed
scientific
要求以科学计数法输出
fixed
要求输出的精度为小数点后位数,而不是有效数字个数
二者为“黏性”设置
大小写控制uppercase
uppercase
要求科学计数法中的e和十六进制输出的x用大写输出
指定布尔格是boolalpha
boolalpha
指定输出bool类型时以true或者false输出
通过成员函数cout.flags()
设置和重置格式状态
成员函数cout.flags()
无参数时返回之前格式状态以fmtflags
数据类型的形式返回;有参数时返回之前的格式状态并将当前状态设置成参数的格式状态
"include......." int main(){ int integer1 = 100; ios_base::fmtflags originalFormat = cout.flags();//返回当前格式状态 cout<< showbase<<oct<<scientific; cout<<cout.flags()<<integer; cout.flags(originalFormat);//设置成原来的格式 cout<<cout.flags()<<integer; }
13.6 流的错误状态
通过检测ios_base
类中的相应位来判断
-
当遇到文件尾时,输入流的
eofbit
位将被设置,调用函数cin.eof()
进行判断 -
当发生格式错误时,
failbit
位将被设置,并且不会读取任何字符,通过cin.fail()
判断 -
当发生数据错误时,
badbit
位将被设置,通常这种错误无法修复,通过cin.bad()判断
-
当
bad, fail, eof
都为false时,goodbit
将被设置成true,通过cin.good()
判断
成员函数cin.clear()
可以清空cin
,然后将goodbit
设置成true保持I/O状态良好继续执行
13.7 将输出流连接到输入流
成员函数tie()
让输出和输入同步操作
cin.tie(&cout);//让输出在接下来的输入操作之前被显示
inputStream.tie(0);//解除绑定