Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1682286
  • 博文数量: 210
  • 博客积分: 10013
  • 博客等级: 上将
  • 技术积分: 2322
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-25 15:56
文章分类

全部博文(210)

文章存档

2011年(34)

2010年(121)

2009年(37)

2008年(18)

我的朋友

分类: 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

Fstreamifstreamofstream fstream,wifstream,wofstream,wfstream

Sstreamistringstreamostringstreamstringstream,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());

}

阅读(1218) | 评论(0) | 转发(0) |
0

上一篇:静静的我想你了

下一篇:2010.08.19

给主人留下些什么吧!~~