八章 札记--C++ primer 之旅

来源:互联网 发布:java log4j的使用 编辑:程序博客网 时间:2024/05/17 00:18
IO 对象 不可复制或赋值
形参或返回类型不能是流类型,可以通过传递或返回指向该对象的指针或引用 来传递和返回IO 对象。

所有流对象都包含一个条件状态成员,类型为iostate 类型

流的状态由 bad , fail ,eof 和 good 操作解释,如果 bad,fail 或者 eof 任意一个为 true ,则检查流本身将显示该流处于错误状态。反之,如果三个没有一个是true ,则 good 操作将返回 true。

流的状态成员有setstate 和 clear 操作管理。
     clear: 将条件重设为有效状态。     
     setstate: 打开某个指定的条件,用于表示某个问题的发生。

书中课后题:
编写一个函数,其唯一的形参和返回值都是istream& 类型,该函数应一直读取流直到到达文件结束符。并将读到的内容输出,最后,重设流设其有效,并返回流。
istream& testIO(istream &ist)
{
     string s;
     while(ist>>s,!ist.eof())
     {
          assert(!ist.bad());
          if(ist.fail())
          {
               cerr<<"bad data, try again";
               ist.clear(istream::goodbit);
               continue;
          }
          cout<<"your input:"<<s<<endl;
     }

     ist.clear();
     return ist;
}

输出缓冲区管理:
     1输出缓冲区刷新: 1) endl: 输出一个换行符并刷新缓冲区; 2)flush不在输出添加任何字符,刷新; 3)ends: 在缓冲区中插入空字符null,然后刷新。
     2,unitbuf 操作符: 需要刷新所有输出时使用。在每次执行完写操作后都刷新流。
          EX:  cout<<unitbuf<<"first"<<"second"<<nounitbuf;
                 等价于 :cout<<"first"<<flush<<"second"<<flush;
               nounitbuf 使流恢复为正常的,由系统管理的刷新方式。
     注意: 程序崩溃,不会刷新缓冲区; 所以最好保证在程序中所有的输出操作都显示调用了flush 或 endl
     
     3、输入和输出绑在一起: 任何读输入流的尝试都将首先刷新其输出流关联的缓冲区。
          tie 函数 可用istream 或 ostream 对象调用。tie 的形参是指向ostream对象的指针。


文件的输入和读出

fstream 头文件 定义了三种支持文件IO 的类型:
     1)ifstream 由 istream 派生, 提供读文件
     2)ofstream 由ostream 派生, ....写......
     3)fstream   由iostream 派生,....读写同一个文件的功能。
两个操作: open() 和 close()  参数都是文件名,使用C风格字符串,用string.c_str()
     
检查文件打开是否成功:
     ifstream infile;
     infile.open("in");
     if(!infile) {   打开失败   }
     。。。。

如果重用文件流读写多个文件,必须在读另一个文件之前调用clear 清除该流的状态。


文件模式:
     in :读操作
     out: 写操作
     app: 每次写之前找到文件尾
     ate:     打开文件后立即将文件定位到文件尾。 (只在打开时有效)
     trunc : 打开文件清空已存在的文件流
     binary: 二进制模式进行IO操作。

注意: ofstream 对象指定out 模式等效于 同时指定了 out 和 trunc 模式
          EX: ofstream outfile("file");
          等价于   ofstream outfile("file", ofstream::out |  ofstream::trunc);

字符串流:
sstream 头文字
     1)istringstream 由 istream 派生. 提供读string    
     2)ostringstream 由 ostream派生,   写
     3)stringstream 由 iostream 派生, 读写



stringstream 的操作:
     stringstream   strm:       创建对象
     stringstream   strm(s);   创建存储s的副本的stringstream对象,s是string类型对象
     strm.str()                      返回strm中存储的string类型对象
     strm.str(s)                     将string类型的s复制给strm,返回void





原创粉丝点击