C++ IO库操作

目录

1、库类型和头文件

2、IO对象不能拷贝或赋值

3、IO对象条件状态

3.1、条件状态

3.2、条件状态函数

4、管理输出缓冲

4.1、缓冲刷新

4.2、关联流

5、文件输入输出

5.2、文件模式

5.2.1、指定文件模式的限制

6、string流

7、定义在iostream中的操纵符

8、定义在iomanip中的操纵符

9、单字节底层IO操作

10、多字节底层IO操作

11、流随机访问


1、库类型和头文件

头文件类型说明
iostreamistream,wistream从流读取数据
ostream,wostream向流写入数据
iostream,wiostream读写流
fstreamifstream,wifstream从文件读取数据
ofstream,wofstream向文件写入数据
fstream,wfstream读写文件读写文件
sstreamistringstream,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操作来重定位标记。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值