分类: C/C++
2010-08-19 21:54:59
C++的输入输出由标准库提供,支持控制窗口、文件、内存的读写操作
Cin cout 对象
标准库使用了继承来定义一组面向对象类
每一个头文件定义了3个类,包括只读,只写,以及读写共3*3=9个,此外每一个类都包括一个宽字符读写类,9*2=18个类
Iostream :istream从流中读取,ostream向流中写,iostream可读可写,wistream,wostream,wiostream
Fstream:ifstream,ofstream ,fstream,wifstream,wofstream,wfstream
Sstream:istringstream,ostringstream,stringstream,wistringstream,wostringstream,wstringstream
如果函数有基类类型的引用形参,可以传递派生类的对象来调用函数。
但是io对象不可以复制和赋值,含义主要有两层:1, 流对象不能存储在容器中,2, 形参或返回类型不能为流类型,但是可以是流的引用类型。
ofstream test(ofstream &file){//错误,不能返回流对象
return file;
}
int main(int argc, _TCHAR* argv[])
{
ofstream file1,file2;
file1=file2;//错误,流对象不允许赋值
}
一般要传递流对象的引用给函数,可用非const引用的方式传递,因为读取流对象的时候,流对象的状态肯定改变。
IO标准库定义了一系列的条件状态,用于表示流对象的状态是否可用
Badbit,failbit,eofbit,s.eof(),s.fail(),s.good(),s.bad(),s.clear(),s.clear(flag)等等
一般程序只是单纯的检测流对象是否可用,但有时候必须检测流对象的状态时什么,判断哪儿出错了。
Badbit是系统级错误,无法恢复的读写错误;failbit是希望读入数字时输入了字符串,或读到文件结尾了.
int main(int argc, _TCHAR* argv[])
{
int a;
while(cin>>a,!cin.eof()){//逗号操作符返回最后一个操作数的值,当没有读到文件结尾的时候循环
if(cin.bad())//当遇到系统错误的时候设置badbit位
throw runtime_error("IOstream error");//抛出错误
if(cin.fail()){//当读到不是int类型的参数时候,设置failbit位
cin.clear(istream::failbit);//清除failbit位
contimue;
}
cout<当流对象没有任何错误的时候,对a进行操作
}
}
每个io对象都管理一个缓冲区
缓冲区刷新:
1. 显式的刷新
2. 缓冲区满
3. 程序正常结束,崩溃的时候不会刷新缓冲区
4. Unitbuf清空缓冲区
5. 将读写流关联起来tie。
cout<刷新
cout<刷新
cout<
cin.tie(cout);//tie绑定刷新,tie(0)打破流上的捆绑
int main(int argc, _TCHAR* argv[])
{
string s1("in.txt");
string s2("out.txt");
ifstream in;
in.open(s1.c_str(),fstream::in);//c风格的字符串作为形参,文件模式in代表读,out代表清空写,app代表写前找到文件尾,ate打开后定位到文件尾,trunc清空,binary二进制方式打开,不处理字符
if(!in){//判断in对象是否可用
cout<<"error"<
return -1;
}
in.close();
in.clear();//这两个是一起用的,在关闭之后清空之前的对象状态之后才能重新定位到新的文件
in.open(s2.c_str());
}