标准IO库
1. 面向对象的标准库
标准库定义了一族类型,支持对文件和控制窗口等设备的读写(IO),还定义了其他一些类型,使string对象能够像文件那样进行操作,从而使我们无需IO就能够实现数据与字符串之间的转换。
>> 操作符,用于从istream对象中读入输入。
<< 操作符,用于把输出写到ostream对象中。
2. 条件状态
IO标准库管理了一系列条件状态成员,用来标记给定的IO对象是否处于可用状态,或者碰到了那种特定的错误。
在需要更加详细的访问或控制流的状态时,除了知道流处于的错误状态外,还必须了解它遇到了那种类型的错误。
所有的流对象都包含一个条件状态成员,该成员由setstate和clear操作管理,这个状态成员为iostream类型,
IO标准库的条件状态
IO标准库的条件状态 | |
strm::iostate |
机器相关的整型名,由各个iostream类型定义,用于定义条件状态 |
strm::badbit |
strm::iostate类型的值,用于指出被破坏的流 |
strm::failbit |
strm::iostate类型的值,用于指出失败的IO操作 |
strm::eofbit |
strm::iostate类型的值,用于指出流已经达到文件结束符 |
s.eof() |
如果设置了流s的eofbit值,则该函数返回true |
s.fail() |
如果设置了流s的failbit值,则该函数返回true |
s.bad() |
如果设置了流s的badbit值,则该函数返回true |
s.good() |
如果流s处于有效状态,则该函数返回true |
s.clear() |
将流s中的所有状态值都重设为有效状态 |
s.clear(flag) |
将流s中的某个指定条件状态设置为有效。flag的类型是strm::iostate |
s.setstate(falg) |
给流s添加指定条件。flag的类型是strm::iostate |
s.rdstate() |
返回流s的当前条件,返回值类型为strm::iostate |
3. 输出缓冲区的管理
每个IO对象管理一个缓冲区,用于存储程序读写的数据。
缓冲区的内容被刷新,即写入到真实的输出设备或文件中。
以下几种情况是缓冲区刷新的情况:
1. 程序正常结束,作为main返回工作的一部分,清空所有输出缓冲区
2. 在一些不确定的时候,缓冲区可能已经满了,这时,缓冲区将会在写下一个值之前刷新。
3. 用操作符显式的刷新缓冲区,如行结束符endl
4. 在每次输出操作执行完后,用unitbuf操作符设置流的内部状态,从而清空缓冲区。
5. 可将输出流与输入流关联(tie)起来。这种情况下,在读输入流时将刷新其关联的输出缓冲区。
4.文件的输入和输出
提供三种头文件支持文件IO类型
ifstream提供读文件功能
ostream 提供写文件的功能
fstream 提供读写同一个文件的功能
fstream定义了两个新操作----open和close,以及形参为要打开的文件名的构造函数。
需要读写文件时,必须定义自己的对象,并将它们绑定在需要的文件上。例如ifile和ofile是希望读写的文件名的string对象,则
ifstream infile(ifile.c_str());
ofstream outfile(ofile.c_str());
首先需要定义自己的对象infile和outfile,然后将它们绑定在读写的文件上,ifile,ofile是文件名。
5.文件模式
再打开文件时,无论是调用open还是以文件名作为流初始化的一部分,都需要指定文件模式,每个fstream类都定义了一组表示不同模式的值,用来指定流打开的不同模式。
文件模式 | |
in |
打开文件做读操作 |
out |
打开文件做写操作 |
app |
在每次写之前找到文件尾 |
ate |
打开文件后立即将文件定位在文件尾 |
trunc |
打开文件时清空已存在的文件流 |
binary |
以二进制模式进行IO操作 |
与ifstream流对象关联的文件将以in模式打开,该模式允许文件做读的操作;与ofstream关联的文件则以out模式打开,使文件可写。以out模式打开的文件会被清空:丢弃该文件存储的所有数据。
1.对同一文件做输入和输出运算,
fstream inOut(”copyOut”, fstream::in | fstream::out);
当文件同时以in和out打开时不清空,
2. 模式是文件的属性而不是流的属性
每次打开文件时都要设置模式。只要调用open函数,就要设置文件模式,其模式的设置可以是显式的也可以是隐式的。若没有指明文件模式,则是默认值。
3. 打开模式的有效组合
文件模式的组合 | |
out |
打开文件做写操作,删除文件中已有的数据 |
out | app |
打开文件做写操作,在文件尾写入 |
out | trunc |
与out模式相同 |
in |
打开文件做读操作 |
in | out |
打开文件做读写操作,并定位于文件开头处 |
in | out |trunc |
打开文件做读写操作,删除文件中已有的数据 |
6.字符串流
iostream标准库支持内存中的输入和输出,只要将流与存储在程序内存中的string对象捆绑起来即可。此时,可使用iostream输入和输出操作符读写这个string对象。
标准库定义三种类型的字符串流
istringstream,由istream派生而来,提供读string的功能。
ostringstream,由ostream派生而来,提供写string的功能。
stringstream,有iostream派生而来,提供读写string的功能。
要使用上述类,必须包含sstream头文件。
stringstream特定的操作 | |
stringstream strm |
创建自由的stringstream对象 |
stringstream strm(s) |
创建存储s的副本的stringstream对象,其中s是string类型的对象 |
strm.str() |
返回strm中存储的string类型对象 |
strm.str(s) |
将string类型的s复制给strm,返回void |
1.stringstream对象的使用;
对每行中的每个单词进行操作实现。可以使用stringstream对象实现。
程序读取整行的内容,然后为了获得每行中的单词,将一个istringstream对象与所读取的行绑定起来,这样只需要使用普通的string输入操作符即可读出每行中的单词。
代码示例:
string line, word;
while(getline(cin, line))
{
istringstreamstream(line);
while(stream>> word) //从行line中读取每一个单词word
{
//
}
}
2.stringstream提供的转换和格式化
stringstream对象的一个常见用法就是,需要在多种数据类型之间实现自动格式化时使用该类类型。例如,有一个数值型数据集合,要获取他们的string类型表达式,或反之。sstream输入和输出操作可自动地吧算术类型转化为相应的string表示形式,反过来也可以。
intval1 = 512, val2 = 1024;
ostringstreamformat_message;
format_message<< “val1:” << val1 << “\n” << “val2” << val2<< ‘\n”;
用istringstream读string对象,即可重新将数值类型数据找回来。读取istringstream对象自动地将数值型数据的字符表示方式转换为相应的算术值。
istringstreaminput_istring(format_message.str());
stringdump;
input_istring>> dump >> val1 >> dump >> val2;
cout<< val1 << “ ” << val2 << endl;
这里使用str成员获取与之前创建的ostringstream对象关联的string副本。再将input_istring与string绑定起来。在读input_istring时,相应的值恢复为他们原来的数值型表示方式。