《C++Primer》读书笔记——第8章 IO库

来源:互联网 发布:windows pe系统是什么 编辑:程序博客网 时间:2024/05/16 01:28
  1. IO库类型和头文件【重点】
    1. 头文件< iostream>读写流
      类型istream/ostream/iostream(还有宽字符版本wistream,下同)
    2. 头文件< fstream>读写文件
      类型ifstream/ofstream/fstream
    3. 头文件< sstream>读写string
      类型istringstream/ostringstream/stringstream
  2. 管理输出缓冲【重点】
    导致缓冲刷新(即数据真正写到输出设备或文件)的原因有很多:
    • 程序正常结束,作为main函数的return操作的一部分,缓冲刷新被执行
    • 缓冲区满,
    • 使用操纵符显式刷新(如endl,flush,ends)
      cout << “hi” << endl;//输出hi和一个换行,然后刷新缓冲区
      cout << “hi” << flush;//输出hi,然后刷新缓冲区,不附加任何额外字符
      cout << “hi” << ends;//输出hi和一个空字符,然后刷新缓冲区
    • 在每个输出操作之后,我们可以用操纵符unitbuf来设置流的内部状态(PS:cerr被默认设置为unitbuf)
      cout << unitbuf;//所有输出操作后都会立即刷新缓冲区
      //任何操作都立即舒心,无缓冲
      cout << nounitbuf;//回到正常的缓冲方式
    • 一个输出流可能被关联到另一个流,当读写被关联流时,关联到的流的缓冲区将被刷新。(PS:默认cin cerr都关联到cout,因此读cin写cerr都会导致cout缓冲区刷新)每个流最多关联到一个流,但多个流可以同时关联到同一个ostream
  3. 文件输入输出
    1. fstream特有的操作
      • fstream fstrm;//创建一个未绑定的文件流
      • fstream fstrm(s);//创建一个fstream,并打开名为s的文件
      • fstream fstrm(s, mode);//同上,只不过是以mode模式打开
      • fstrm.open(s);//打开名为s的文件,并将其与fstrm绑定。返回void
      • fstrm.close();//关闭与fstrm绑定的文件。返回void(PS:当一个fstream对象被销毁时,close会自动被调用)
      • fstrm.is_open;//返回一个bool值,指出与fstrm关联的文件是否成功打开且尚未关闭
    2. 文件模式
      • in 以读方式打开//与ifstream关联的文件默认以in打开
      • out 以写方式打开//与ofstream关联的文件默认以out打开
      • app 每次写操作前均定位到文件末尾
      • ate 打开文件后立即定位到文件末尾
      • trunc 截断文件
      • binary 以二进制方式进行IO
        PS1:以out模式打开的文件会丢弃已有数据
        PS2:以多种模式打开文件:ofstream app(“file”, ofstream::out | ofstream::app)
  4. string流
    1. stringstream特有的操作
      • sstream strm;//strm是为绑定的stringstream对象
      • sstream strm(s);//strm保存string s的一个拷贝
      • strm.str() 返回strm所保持的string拷贝
      • strm.str(s) 将string s拷贝到strm中。返回void
    2. istringstream常用于——带空格的一行字符串
      例:
      string line, word;
      vector< string> str;
      while( getline(cin,line) ) {
      istringstream strm(line);
      while( strm >> word )
      str.push_back(word);
      }
    3. ostringstream常用于——逐步构造输出,最后一起打印
      ostringstream ostrm;
      for(const auto &str: vec) {
      ostrm << str <<” “;
      }
      cout << ostrm.str() << endl;
      2、3合在一起,即为:多行输入转换为一行输出
#include<iostream> #include<vector> #include<sstream> #include<string> using namespace std;int main(){    string line, word;    vector< string> vec;    while( getline(cin,line) ) {        istringstream strm(line);        while( strm >> word )            vec.push_back(word);    }    ostringstream ostrm;    for(const auto &str: vec) {        ostrm << str <<" ";    }    cout << ostrm.str() << endl;} 
0 0
原创粉丝点击