第八章:标准IO库

来源:互联网 发布:painter mac 编辑:程序博客网 时间:2024/06/05 17:42

1.IO类型在三个独立的头文件中定义:iostream定义读写控制窗口的类型,fstream定义读写已命名文件的类型,sstream定义的类型则用于读写存储在内存中的string对象.

2.IO对象不可复制或赋值,即表明

①无法将其存储在容器中

②形参或返回类型也不能为流类型,如果要传递或返回IO对象,则必须传递或返回指向该对象的指针或引用

3. IO标准库管理一系列条件状态成员,用来标记给定IO对象是否处于可用状态,或者碰到了哪种特定的错误。标准库定义的一组函数和标记,提供访问和操纵流状态的手段。
strm::iostate    
机器相关的整型名,由各个iostream类定义,用于定义条件状态
strm::badbit      strm::iostate
类型的值,用于指出被破坏的流
strm::failbit      strm::iostate
类型的值,用于指出失败的IO操作
strm::eofbit      strm::iostate
类型的值,用于指出流已经到达文件结束符
s.eof()              
如果设置了流seofbit值,则该函数返回true
s.fail()              
如果设置了流sfailbit值,则该函数返回true
s.bad()             
如果设置了流sbadbit值,则该函数返回true
s.good()           
如果流s处于有效状态,则该函数返回true
s.clear()           
将流s中的所有状态值都重设为有效状态
s.clear(flag)     
将流s中的某个指定条件状态设置为有效。flag的类型是strm::iostate
s.setstate(flag) 
给流s添加指定条件。flag的类型是strm::iostate
s.rdstate()        
返回流s的当前条件,返回值类型为strm::iostate
流必须处于无错误状态,才能用于输入或输出。

badbit标志着系统级的故障,出现这类错误,则该流通常就不能再使用了,如果出现的是failbit可恢复的错误,通常是可以修正的

         流的状态有bad,fail,eofgood操作揭示前三个和good相反;clearsetstate操作用于改变条件成员的状态

4.下面几种情况将导致缓冲区的内容被刷新,即写入到真实的输出设备或者文件:

①程序正常结束.作为main返回工作的一部分,将清空所有输出缓冲区.

②在一些不确定的时候,缓冲区可能已经满了,在这种情况下,缓冲区将会在写下一个值之前刷新

     用操作符显式的舒心缓冲区,endl(其实还有flushends)

     在每次输出操作执行完后,unitbuf操纵符设置流的内部状态从而清空缓冲区

     可将输出流与输入流关联起来.在这种情况下,在读输入流时将刷新缓冲区

警告:如果程序崩溃了,则不会刷新缓冲区

这一章在平时编程时一般是简单的使用,用于对文件的读写.

例子:

●创建并向文件写入信息:

方式一:

#include <fstream.h>

#include <iomanip.h>

 

void main()

{

    ofstream f1("a.txt");

    if (!f1)

    {

           return;

    }

    f1<<"姓名:"<<"袁孙良"<<endl;

    f1<<"性别:"<<""<<endl;

    f1.close();

}

方式二:

#include <fstream.h>

 

void main()

{

       ofstream fin("a.txt");

       if (!fin)

       {

              cout<<"File open error";

              return;

       }

       char c[80] = "我是一个兵!";

       fin.write(c,80);

       fin.close();

}

 

●从文件中读取信息:

方式一:

#include <fstream.h>

 

void main()

{

       fstream f("a.txt",ios::out);

       f<<123<<3.14<<'A'<<"How are you";

       f.close();

 

       f.open("a.txt",ios::in);

       int i;

       double d;

       char c;

       char s[20];

       f>>i>>d>>c;

       f.getline(s,20);

 

       cout<<i<<"  "<<d<<"   "<<c<<"   "<<s<<endl;

 

       f.close();

}

方式二:

#include <memory.h>

#include <fstream.h>

 

void main()

{

       ifstream fin("a.txt",ios::nocreate);

       if (!fin)

       {

              cout<<"File open error";

              return;

       }

       char c[80];

       memset(c,0,80);

       while (!fin.eof())

       {

              fin.read(c,80);

              cout<<c<<endl;

       }

       fin.close();

}

简单的复制文件:

#include <fstream.h>

 

void main()

{

       ifstream fin("a.txt",ios::nocreate|ios::binary);

       if (!fin)

       {

              cout<<"File open Error"<<endl;

              return;

       }

 

       ofstream fout("b.txt",ios::binary);

       char c[1024];

       while (!fin.eof())

       {

              fin.read(c,1024);

              fout.write(c,fin.gcount());

       }

 

       fin.close();

       fout.close();

}