1.面向对象的标准库:标准库使用了继承来定义IO类型。在三个头文件中定义,iostream定义读写控制窗口的类型,fstream定义读写文件磁盘的类型,sstream定义读写内存中的字符串对象的类型。每个头文件各有三种类型,这些类型都是从iostream头文件的三种类型派生而来。
2.注意:所描述的流类是由char类型,wchar_t组成的流。由于流对象不能复制,因此不能存储在vector容器中。也不能作为形参和返回类型,必须传递或返回该对象的地址或引用。
ostream & print(ostream & os);
3.条件状态:IO标准库管理一些列条件状态成员来表示io对象是否处于可用状态,或是遇到了特定错误。第一种情况,只要遇到了eof(文件结尾),bad(系统级故障),fail(可恢复的输入错误)任意一种错误均跳出循环。第二种情况,逗号操作符的求解返回的是右边操作数作为整个操作的结果。因此只有eof可以结束这个循环。然后在循环体内检查到底是发生了哪种错误。
while(cin>>word)
{}
while(cin>>word, !cin.eof()){
if(cin.bad())
throw runtime_error("IO stream corrupted");
if(cin.fail()){
cerr<<" bad data, try again";
cin.clear(istream::failbit);
continue;
}
条件状态的设置:setstate,clear,rdstate.其中rdstate()可以读出当前的流状态,clear()可以清楚掉这个状态,就像上面清除failbit状态位一样。另外,setstate也类似于进行位操作。
cin.setstate(ifstream::badbit | ifstream::failbit);
istream::iostate old_state = cin.rdstate();
cin.clear();
process_input();
cin.clear(old_state);
4.一直读取流直到文件结束为止,然后将内容输出到标准输出中,最后重设流为有效,返回该流。
std::istream& get(std::istream& in)
{
int ival;
while(in>>ival, !in.eof()){
if(in.bad())
throw std::runtime_error("IO stream corrupted");
if(in.fail()){
std::cerr<<" bad data, try again";
in.clear();
in.ignaore(200,' ');
continue;
}
std::cout<<ival<<" ";
}
in.clear();
return in;
}
int main()
{
double dval;
get(cin);
cin>>dval;//重新使用恢复后的流
cout<<dval<<endl;
return 0;
}
5.输出缓冲区刷新的原因:
程序正常结束。缓冲区已经满了。用操作符显示的刷新缓冲区。在每次输出操作执行完后,用unitbuf操作设置流的内部状态,从而清空缓冲区。或者将输入流与输出流绑在一起,任何读入都将刷新输出缓冲区。
cout<<"hi"<<endl;
cout<<"hi"<<fulsh;
cout<<"hi"<<ends;
cout<<unitbuf<<"first"<<" second"<<nounitbuf;
6.文件的输入输出
(1)文件的打开关闭和初始化:ifile是存储文件名的string对象。但是文件名要用C风格字符串,所以需要把string类型的对象转换成C风格字符串。
初始化时就是要绑定到一个文件上。
ifstream infile(ifile.c_str());
ofstream outfile(ofile.c_str());
也可以先定义一个流对象,然后用open来绑定文件。
ifstream infile;
infile.open("in");
(2)检查文件打开是否成功:
if(!infile) cerr<<"error:unable to open input file: ";
(3)重新绑定:
ifstream infile("in");
infile.close();
infile.open("next");
(4)如果打算重用已存在的流对象,那么while循环必须在每次循环时记得关闭close和清楚clear文件流,以免存在文件流状态异常。
ifstream input;
vector<string>::const_iterator it = files.begin();
while(it != files.end())
{
input.open(it->c_str());
if(!input) break;
while(input>>s) process(s);
input.close();
input.clear();
++it;
}
7.文件模式:模式是文件的属性而不是流的属性。
ofstream outfile;
outfile.open("scratchpad", ofstream::out|ofstream::trunc);
outfile.close();
outfile.open("precious", ofstream::app);
outfile.close();
有效的打开模式组合:默认都是in和out同事打开的。
out:打开文件写,删除文件中已有的数据
out|app:打开文件写,在文件尾写入
out|trunc:与out模式相同
in:打开文件读
in|out:打开文件读写,并定位与文件开头处
in|out|trunc:打开文件读写,并删除文件中已有的数据
8.字符串流:stringstream对象的使用
string line,word;
while(getline(cin,line)){
istringstream stream(line); //bind to stream to the line we read
while(stream>>word){} //read a word from line
}