IO类
IO库条件状态
- strm是一种IO类型(iostream,fstream,sstream).
- 置位就是bai置1,复位就是清0
状态 | 解释 |
---|---|
strm::iostate | iostate是一种极其相关的类型,提供了表达条件的完整功能 |
strm::badbit | 用来指出流崩溃 |
strm::failbit | 用来指出一个Io操作失败 |
strm::eofbit | 用来指出流到达了文件结束 |
strm::goodbit | 用来指出流末处于错误状态。此值保证为0 |
s.eof() | 若流s的eofbit置位,则返回true |
s.fail() | 若流s的failbit或badbit置位,则返回true |
s.good() | 若流s处于有效状态,则返回true |
s.clear() | 若流s中所有条件状态复位,将流的状态设置为有效.返回void |
s.clear(flags) | 根据给定的flags标志位,将流s中对应条件状态位复位。flags的类型为strm::iostate.返回void |
s.setstate(flags) | 根据给定的flags标志位,将流s中对应条件状态位置为。flags的类型为strm::iostate。返回void |
s.rdstate() | 返回流s的当前条件状态。返回类型为strm::iostate |
管理输出缓冲
-
导致缓冲刷新原因
- 程序正常结束,作为main函数的return操作的一部分,缓冲刷新被执行。
- 缓冲区满时,需要刷新缓冲,而后新的数据才能被继续写入缓冲区。
- 我们可以输出操作之后,我们可以用操作符unitbuf设置流的内部状态,来清空缓冲区。默认情况下,对cerr时设置unitbuf的,因此写到cerr的内容都是立即刷新。
- 我们可以使用操作符endl来显示的刷新缓冲区
- 一个输出流可能被关联到另一个流。在这种情况下,当读写被关联的流时,关联到的流的缓冲区会被刷新。e.g 默认情况下,cin和cerr都关联到cout。因此,都cin或者写cerr都会导致cout的缓冲区被刷新。
-
unitbuf
cout<<unitbuf;//所有的输出操作后都会立即刷新缓冲区
cout<<nounitbuf;//回到正常的缓冲方式
程序异常终止,输出缓冲区不会刷新。所以未打印出的数据会停留在缓冲区中等待打印。所以调试时应注意这点。不要浪费时间区追踪为什么没有执行上。
-
tie
- 版本一:不带参数,返回指向输出流的指针。如果对象当前关联到一个输出流,则返回的就是指向这个流的指针。如果未关联到流,则返回空指针。
- 版本二:接受一个指向ostream的指针,将自己关联到此ostream。即,x.tie(&o)将流x关联到流o。
cin.tie(&cout);//仅仅用来展示:标准库将cin和cout关联在一起 //old_tie指向当前关联到的cin流(如果有的话) ostream *old_tie=cin.tie(nullptr);//cin不再与其他流关联 //将cin与cerr关联、不建议这样做,因为cin应该和cout关联 cin.tie(&cerr);//读取cin会刷新cerr而不是cout cin.tie(&old_tie);//重建cin和cout间的正常关联
文件流
- 特有操作(可以和iostream一样使用>> ,<<)
操作 | 解释 |
---|---|
fstream fstrm; | 创建一个未绑定的文件流。fstream时头文件fstream中定义的一个类型 |
fstream fstrm(s); | 创建一个fstream,并打开名未s的文件。s可以时string类型,或者时一个指向c风格字符串的指针。这些构造函数都是explicit的。默认的文件模式Mode依赖于fstream的类型 |
fstream fstrm(s,mode); | 与前一个构造函数类似,但指定Mode打开文件 |
fstrm.open(s) | 打开名为s的文件,并将文件与fstrm绑定。s可以是一个string或一个指向c风格字符串的指针。默认的文件Mode用来与fstream的类型。返回void。 |
fstrm.open(file,mode) | 打开文件file,并以Mode模式打开,不指定打开模式将默认mode打开 |
fstrm.clost() | 关闭与fstrm绑定的文件。返回void |
fstrm.is_open() | 返回一个bool值,指出与fstrm关联的文件是否成功的打开并且尚未关闭 |
- 正确的使用
for(auto p=argv+1;p!=argv+argc;++p)
{
ifstream input(*p);//创建输出流并打开文件
if(input)//如果文件打开成功,处理文件
{
process(input);
}
else
{
cerr<<"could not open:"+string(*p);
}
}//每个循环步都会离开作用域,因此会被销毁
//但一个fstream对象被销毁时,close会被自动调用
- 文件模式
模式 | 解释 |
---|---|
in | 以读方式打开 |
out | 以写方式打开 |
app | 每次写操作前均定位到文件末尾 |
ate | 打开文件后立即定位到文件末尾 |
trunc | 截取文件 |
binary | 以二进制方式进行IO |
默认情况下,当我们打开一个ofstream时,文件内容会被丢弃。阻止一个ofstream清空给定文件内容的方式是同时指定app模式:
//file1都会被截取 ofstream out("file1");//隐含以输出模式打开文件并截取文件 ofstream out2("file1",ofstream::out);//隐式的截取文件 ofstream out2("file1",ofstream::out | ofstream::trunc);//显示的截取文件 //为了保留文件按内容,显示的指向app模式 ofstream app("file2",ofstream::app);//隐含为输出模式 ofstream app2("file2",ofstream::out | ofstream::app);
string流
-
istringstream和ostringstream(可以和iostream一样使用>> ,<<)
-
操作
操作 解释 sstream strm; strm是一个为绑定的stringstream对象。sstream是头文件sstream中定义的一个类型 sstream strm(s); strm是一个sstream对象。保存string s的一个拷贝。此构造函数是explicit的 strm.str() 返回strm所保存的string的拷贝 strm.str(s) 将string s拷贝到strm中,返回void -
使用
string line;
getline(cin,line);
istringstream record(line);//将记录绑定到刚读入的行
//record>>line
ostringstream bad;
bad<<line;//将line字符串写入bad中