目录
1、库类型和头文件
头文件 | 类型 | 说明 |
iostream | istream,wistream | 从流读取数据 |
ostream,wostream | 向流写入数据 | |
iostream,wiostream | 读写流 | |
fstream | ifstream,wifstream | 从文件读取数据 |
ofstream,wofstream | 向文件写入数据 | |
fstream,wfstream读写文件 | 读写文件 | |
sstream | istringstream,wistringstream | 从string读取数据 |
ostringstream,wostringstream | 向string写入数据 | |
stringstream,wstringstream | 读写string |
注:
1) iostream处理控制台IO
2) fstream处理命名文件IO
3) stringstream处理内存string的IO
2、IO对象不能拷贝或赋值
1)不能对IO对象赋值
2)不能将形参或返回类型设置为流类型。
注:进行IO操作的函数通常以引用方式传递和返回流(读写一个IO对象会改变其状态,所以传递和返回的引用不能是const的)。
3、IO对象条件状态
一个流一旦发生错误,后续对该流的IO操作都会失败。
3.1、条件状态
条件状态 | 说明 |
strm::iostate | 提供了表达条件状态的完整功能 |
strm::badbit | 用于指出流已奔溃 |
strm::failbit | 用于指出一个IO操作失败了 |
strm::eofbit | 用于指出流到达了文件尾 |
strm::goodbit | 用于指出流未处于错误状态 |
3.2、条件状态函数
操作 | 说明 |
s.eof() | 若流s的eofbit置位,则返回true |
s.fail() | 若流s的failbit或badbit置位,则返回true |
s.bad() | 若流s的badbit置位,则返回true |
s.good() | 若流s处于有效状态,则返回true |
s.clear() | 将流s中所有条件状态位复位,将流的状态设置位有效(返回值类型为void)。 |
s.clear(flags) | 根据flags标志位,将流s中对应条件状态位复位(返回值类型为void)。 flags的类型为strm::iostate。 |
s.setstate() | 根据flags标志位,将流s中对应条件状态位置位(返回值类型为void)。 flags的类型为strm::iostate。 |
s.rdstate() | 返回流s的当前状态(返回值类型为strm::iostate)。 |
注:确定一个流对象的状态最简单的方法是将其当作一个条件使用。
while(cin>>word){
//流状态没有发生错误
}
4、管理输出缓冲
4.1、缓冲刷新
1)程序正常结束
2)缓冲区满了
3)使用操纵符(如endl等)显式刷新
4)用操作符unitbuf设置流的内部状态(每次写操作后进行一次flush操作)。
5)一个流被关联到另一个流。在这种情况下,当读写被关联的流时,关联到的流的缓冲区会被刷新(如默认情况下cin和cerr都关联到cout。所以读cin或写cerr都会导致cout的缓冲区被刷新)。
4.2、关联流
每个流同时最多关联到一个流,但多个流可以同时关联到同一个ostream。
函数 | 说明 |
x.tie() | 返回指向输出流的指针。 如果本对象关联到一个输出流,则返回指向这个流的指针。 如果对象未关联到流,则返回空指针。 |
x.tie(&o) | 将自己关联到输出流,即将流x关联到输出流o。 o的类型为ostream。 注:x.tie(nullptr)用于解开流的关联 |
5、文件输入输出
函数 | 说明 |
fstream fstrm | 创建一个未绑定的文件流 注:函数是explicit的。 |
fstream fstrm(s) | 创建一个fstream,并打开名为s的文件。 s可以是string类型、指向C风格字符串的指针 注:函数是explicit的。 |
fstream fstrm(s,mode) | 创建一个fstream,按指定mode打开文件s。 注:函数是explicit的。 |
fstrm.open() | 打开名为s的文件,并将文件与fstrm绑定(返回void) s可以是string类型、指向C风格字符串的指针 |
fstrm.close() | 关闭与fstrm绑定的文件(返回void) |
fstrm.is_open() | 返回一个bool值,指出fstrm关联的文件是否成功打开且尚未关闭 |
5.2、文件模式
模式 | 说明 |
in | 以读方式打开 |
out | 以写方式打开 |
app | 每次写操作前均定位到文件末尾 |
ate | 打开文件后立即定位文件末尾 |
trunc | 截断文件 |
binary | 以二进制方式进行IO |
注:每个文件流类型都定义了一个默认的文件模式.与ifstream关联的文件默认以in模式打开;与ofstream关联的文件默认以out模式打开;与fstream关联的文件默认以in和out模式打开。
5.2.1、指定文件模式的限制
1)只能对ofstream或fstream对象设定out模式。
2)只能对ifstream或fstream对象设定in模式
3)只有当out也被设定时,才可设定trunc模式
4)只要trunc没被设定,就可以设定app模式(在app模式下,即使没有显式指定out模式,文件也总是以输出方式打开)。
5)默认情况下,即使没有指定trunc,以out模式打开的文件也会被截断。为了保留以out模式代开的文件的内容,必须指定app模式;或同时指定in模式。
6)ate和binary模式可用于任何类型的文件流对象,且可以与其他任何文件模式组合使用
6、string流
操作 | 说明 |
sstream strm | 构造函数。 |
sstream strm(s) | 带参数的构造函数。 |
strm.str() | 返回strm所保存的string的拷贝。 |
strm.str(s) | 将string s拷贝到strim中(返回void)。 |
7、定义在iostream中的操纵符
boolalpha | 将true和false显示为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 | 输入运算符不跳过空白符 |
flush | 刷新ostream缓冲区 |
ends | 插入空白符,然后刷新ostream缓冲区 |
endl | 插入换行,然后刷新ostream缓冲区 |
注:表中粗体为默认流状态。
8、定义在iomanip中的操纵符
操作 | 说明 |
setfill(ch) | 用ch填充空白 |
setprecision(n) | 将浮点精度设置为n |
setw(w) | 读或写值的宽度为w个字符(只决定下一个输出的大小) |
setbase(b) | 将整数输出为b进制 |
9、单字节底层IO操作
操作 | 说明 |
is.get(ch) | 从istream is读取下一个字节存入字符ch中。返回is |
os.put(ch) | 将字符ch输出到ostream os。返回os |
is.get() | 将is的下一个字节作为intf返回 |
is.putback(ch) | 将字符ch放回is。返回is |
is.unget() | 将is向后移动一个字节。返回is。 |
is.peek() | 将下一个字节作为int返回,但不从流中删除 |
10、多字节底层IO操作
操作 | 说明 |
is.get(sink,size,delim) | 从is中读取最多size个字节,并保存在字符数组sink中。读取过程直至遇到字符delim或读取了size个字节或于东文件尾时停止。 注:如果遇到delim,则将其留在输入流中,不读取出来存入sink。 |
is.getline(sink,size,delim) | 与接受三个参数的get版本类似,但会读取并丢弃delim。 注:不存入sink。 |
is.gcount() | 返回上一个未格式化读取操作从is读取的字节数 注1:应该在任何后续未格式化输入之前调用gcount。 注2:将字符退回流的单字符操作也属于未格式化输入操作(如果在调用gcount之前调用了peek、unget或putback,则gcount的返回值为0) |
os.write(source,size) | 将字符数组source中的size个字节写入os。返回os |
is.ignore(size,delim) | 读取并忽略最多size个字符,包括delim。 注:与其他未格式化函数不同,ignore有默认参数:size的默认值为1,delim的默认值为文件尾 |
11、流随机访问
操作 | 说明 |
tellg() | 返回一个输入流中标记的当前位置 |
tellp() | 返回一个输出流中标记的当前位置 |
seekg(pos) | 在一个输入流将标记重定位到给定的绝对地址 |
seekp(pos) | 在一个输出流中将标记重定位到给定的绝对地址 |
seekg(off,from) | 在一个输入流(seekg)或输出流(seekp)将标记定位到from之前或之后off个字符,from可能是下列值之一: 1)beg,偏移量相对于流开始位置 2)cur,偏移量相对于流当前位置 3)end,偏移量相对于流结尾位置 |
seekp(off,from) |
注:只有单一的标记(读写位置都映射到单一的标记),因此在读写操作切换时,必须进行seek操作来重定位标记。