从来就没有救世主  也不靠神仙皇帝  要创造人类的幸福  全靠我们自己  

标准库_IO 流

1. I/O相关的类、对象

  1.1 类

        

   

  1.2 标准输入、输出

(1)继承关系

      

(2)标准流对象

  cin:istream对象,标准输入

  cout:ostream对象,标准输出

       cerr:ostream对象,标准错误输出

  1.3 

  不能拷贝或对IO对象赋值

  不能将形参、返回类型设置为流类型,而用 引用方式传递或返回流 , 读写IO对象会改变其状态,

     传递和返回的引用不能是const的

 

  1.4 条件状态:

        

          

 

         流发生错误时相应的标志会置位/复位,只有当流处于无措状态时才能继续操作

         使用流时检查是否出于良好的状态:

      while(cin>>word)

 

  1.5 缓冲区

  (1)

        缓冲刷新:

            程序正常结束

            缓冲区满

            endl显式刷新缓冲区

            每个输出操作后,用操纵符  unitbuf 设置流的内部状态清空缓冲区;对cerr都是设置了unitbuf的

            读写关联的流时,关联到的流会刷新缓冲区。如读cin、写cerr会导致cout的缓冲区刷新

  (2)

cout<<"hello"<<endl;   //输出字符串和换行,刷新缓冲区
cout<<"hello"<<flush;  //输出字符串,刷新缓冲区
cout<<"hello"<<ends;  //输出字符串和一个空字符,刷新缓冲区

  (3)

cout<<unitbuf;     //所有输出操作后立刻刷新缓冲区
cout<<nounitbuf;  

(4)关联流

  输入流关联到输出流、输出流关联到输出流

 

 

ostream *old_tie = cin.tie(nullptr); //cin不再与原来的某个流关联
cin.tie(&cerr);     //cin与cerr关联,因此读取cin时会刷新cerr
cin.tie(old_tie);   //重建原来的关联

 

  1.6 其他输入、输出方式

  将输入流当作不知类型的字节序列读取(而不是特定字节数如char、int、string等)

  (1)get()

int ch;
while((ch = cin.get()) != EOF) {
    cout.put(ch);
}

  (2)get(char &ch)

        从流读取一个字符,包括 空白字符 存储到ch

  (3)get(char *sink,streamsize size,char delimiter)

        从istream读取size个字符到sink,直到流中没有字符了或读取到最大数size或遇到终止字符 delimiter(这个delimiter不会被读入,而是留在istream中作为istream的下一个字符)

   去掉这个字符:

      

 

 

  (4)getline

  istream成员函数:

    

 

  

    标准库<string>中的非成员函数

    

 

 

 

  (5)输入流实际提取的字符数

    

 

 

  (6)输出流的write与输入流的read 

    

 

     

 

 

 

2. 文件输入、输出

    头文件<fstream>(这个头文件里面包含了<iostream>)

  2.1 

  fstream、ifstream、ofstream对象可用的操作:

     

 

   对于空的流对象,需要调用open打开文件

  2.2 文件模式

    

 

   需要多个模式,用  |  连接各个模式

   2.3 定位

    

 

    

 

   pos是指定绝对位置:0表示文件开始

   off是相对dir的相对位置  

   dir:

    ios_base::beg  文件开始

              ios_base::cur    文件当前位置

              ios_base::end   文件结尾

  

 

3. string流

 

  istringstream:获取字符串到istringstream流对象,从流中提取数据   >>、read、get

       ostringstream:把其他类型数据写入ostringstream流对象                   <<、out、write

(1)istringstream

  从这个流的对象里面获取数据,因此重载了操作符 >>

  初始化:

istringstream istrstrm("abcdefg"); //开始初始化
istrstrm.str("12 345");//流重新初始化为"12 345"

  常用成员函数:一般是从流中提取数据

    带格式: 实现字符串转数字

istrstrm.str();  //查看istringstream流中存储的字符串内容,只是查看,并没有从流里面取
string
a,b; istrstrm>>a>>b; //将流中数据"12"保存到字符串a中,"345"保存到b中
//或者从字符串中提取算术值 "123" --> 123
istrstrm.str("12 3.14"); //重新初始化 中间是空格、换行符都可以
int a;
float b;
istrstrm>>a>>b; //a为int的12 b为float的3.14
//若b声明为int,则只会把3.14中的3取出来存到b
/*
很方便的实现字符串转数字
<cstdlib>中的其它字符串转数字方法:
  int atoi(const char *nptr);
  long atol(const char *nptr);
  long long atoll(const char *nptr);
  float atof(const char *nptr);
*/

    无格式:get、read、getline等

istrstrm.str("0123");
char ch = istrstrm.get();  //获取一个字符存到ch,这里取了'0'到ch  流中剩下"123"
streamsize num = istrstrm.gcount(); //最近一次 无格式 从流获取的字符数,这里是上面的get所获取的数:1

istrstrm.str("0\n123");
char str[4];
istrstrm.read(str,4); //从流读取4个字符 '0'、'\n'、'1'、'2' 到str
num = istrstrm.gcount(); //num为4

 

(2)ostringstream

  向这个流对象里面写数据(string)进去, 重载了操作符 <<

  初始化:

ostringstream ostrstrm("1234");
ostrstrm.str("5678");

 

  成员函数:

    无格式:<<

    带格式:put、write

  <<、put、write会覆盖掉初始化的内容(写几个到流里面就覆盖几个)

  这个流对象的作用:组合各种类型数据成字符串

ostringstream ostrstrm;
string name = "wa ha ha";
int age = 10;
ostrstrm<<"name:"<<name<<endl;
ostrstrm<<"age"<<age<<endl;

 

  对比istringstream、ostringstream:

    需要组合各种类型数据存到字符串,可用ostringstream

    需要从字符串中提取有用数据、格式化的数据,用istringstream

 

posted @ 2020-01-27 23:25  T,X  阅读(216)  评论(0)    收藏  举报