查漏补缺——IO库

1、IO类

为了支持不同种类的IO处理,标准库定义了一些IO类型:

头文件                                                    类型

iostream                                      istream,wistream从流读取数据

                                                     ostream,wostream向流写入数据

                                                     iostream,wiostream读写流

fstream                                        ifstream,wifstream从文件读取数据

                                                     ofstream,wofstream向文件写入数据

                                                     fstream,wfstream读写文件

sstream                                       istringstream,wistringstream从内存string读取数据

                                                     ostringstream,wostringstream向内存string写入数据

                                                     stringstream,wstringstream读写内存string

宽字符版本的类型和函数的名字以w开头。类型fstream和sstream都是继承自iostream。我们可以像使用iostream一样使用fstream和sstream。



2、IO对象无拷贝或者赋值

我们不能拷贝或对IO对象赋值,因此我们也不能将形参或返回类型设置为流类型。进行IO操作的函数通常以引用方式传递或返回流。



3、管理输出缓冲

每个输出流都管理一个缓冲区,用来保存程序读写的数据。

导致缓冲刷新(即数据真正写到输出设备或文件)的原因有很多:

  • 程序正常结束,作为main函数的return操作的一部分,缓冲刷新被执行
  • 缓冲区满时,需要刷新缓冲,而后新的数据才能继续写入缓冲区
  • 我们使用endl操纵符来显式刷新缓冲区
  • 使用unitbuf操纵符告诉流在接下来的每次操作之后都进行一次flush操作。在默认情况下,对cerr(通常用于输出程序错误信息,写入到标准错误)是设置unitbuf,在每个输出操作后,都会清空缓冲区。而nounitbuf操纵符是使其恢复使用正常的系统管理的缓冲区刷新机制。  cout<<unitbuf;  cout<<nounitbuf;
  • 一个输出流可能被关联到另一个流,在这种情况下,当读写被关联的流时,关联到的流的缓冲区会被刷新。如在默认情况下,cin和cerr都关联到cout,因此读cin或写cerr都会导致cout的缓冲区被刷新。



我们已经知道 endl操纵符完成换行并刷新缓冲区的工作,IO中还有两个类似的操作符: flush刷新缓冲区但不输出额外的字符; ends向缓冲区插入一个空字符然后刷新缓冲区。


交互式系统通常应该关联输入流和输出流。这意味着所有输出,包括用户提示信息,都会在读操作之前被打印出来。
使用x .tie(&o)将流x关联到输出流o。


4、文件模式
in 以读方式打开文件。文件不存在打开失败,文件存在则打开
out:以写方式打开文件。文件不存在则创建在打开,文件存在则清空
binary文件默认是以文本形式打开,当指定次模式,以二进制打开。
trunc如果文件不存在,则无效,当文件存在时,首先删除里面的内容,截断文件。
app 所有输出附加在文件末尾,读操作与写操作共享指针(位置指针),具有读文件的特性,也就是说在与out组合使用的时候,不清空文件
ate 打开文件后立即定位到文件末尾


假想文件操作(假设文件存在):
文件末尾添加:iso::out|iso::app 或者iso::out|iso::in|ios::ate     注意:iso::out|iso::ate会清空里面的数据
清空文件添加:iso::out
读取:iso::in
读写文件:iso::out|iso::in
读写前清空:iso::out|iso::in|iso::trunc
阻止一个ofstream清空给定文件内容的方法是同时制定app模式。

假想文件操作(假设文件不存在)
不可能进行纯粹的读操作
向文件里写东西:ios::out
向文件里读写:iso::in|iso::out

注意:对于每一个给定的文件流,每当打开文件时,都要设置文件模式。可能是显式的设置,也可能是隐式地设置。当程序没有指定模式时,使用默认值。



5、string流
stringstream 特定的操作:
stringstream strm; // 创建自由的 stringstream 对象
stringstream strm(s); //创建存储 s 的副本的 stringstream 对象,其中 s 是 string 类型的对象
strm.str() //返回 strm 中存储的 string 类型对象
strm.str(s) //将 string 类型的 s 复制给 strm,返回 void


当我们的某些工作是对整行文本进行处理,而其他一些工作是处理行内的单个单词时,通常可以使用 istringstream
string line, word; // will hold a line and word from input,respectively
while (getline(cin, line))
{
// read a line from theinput into line do per-line processing
istringstream stream(line); // bind to stream to the
line we read
while (stream >> word)
{
// read a word from line
// do per-word processing
}
}
这里,使用 getline 函数从输入读取整行内容。然后为了获得每行中的单词,将一个 istringstream 对象与所读取的行绑定起来,这样只需要使用普通的 string 输入操作符即可读出每行中的单词。

当我们逐步构造输出,然后希望最后一起打印时, ostringstream是很有用得。
更多的关于sstream的知识可以参看: http://blog.csdn.net/qq1987924/article/details/7671154,讲解的很详细清晰。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值